是否可以使用私有构造函数创建 C# 记录?

Is it possible to create a C# record with a private constructor?

您好,

我正在尝试用 C# 重建 discriminated union type
我总是像这样用 类 创建它们:

public abstract class Result
{
    private Result() { }

    public sealed class Ok : Result
    {
        public Ok(object result)    // don´t worry about object - it´s a sample
            => Result = result;
        
        public object Result { get; }
    }

    public sealed class Error : Result
    {
        public Error(string message)
            => Message = message;

        public string Message { get; }
    }
}

问题是与 F# 相比,样板代码太多了:

type Result =
    | Ok of result : object
    | Error of message : string

所以我尝试在 C#9 的帮助下重建类型 records

public abstract record Result
{
    public sealed record Ok(object result) : Result;
    public sealed record Error(string message) : Result;
}

现在代码少了很多,但现在有一个问题,任何人都可以对 Result 进行新的实现,因为记录有一个 public 构造函数。

有没有人知道如何限制根记录类型的实现?

感谢您的帮助和想法!

我在你的评论和其他 的帮助下解决了它。

namespace System.Runtime.CompilerServices
{
    internal static class IsExternalInit { }
}

namespace RZL.Core.Abstractions.DMS
{
    public abstract record Result
    {
        private Result() { }

        public sealed record Ok(object result) : Result;
        public sealed record Error(string message) : Result;
    }
}