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

Jak*_*and 20 c# f# record discriminated-union

你好,

\n

I\xc2\xb4m 尝试discriminated union type在 C# 中重建 a 。
\n我总是用这样的类创建它们:

\n
public abstract class Result\n{\n    private Result() { }\n\n    public sealed class Ok : Result\n    {\n        public Ok(object result)    // don\xc2\xb4t worry about object - it\xc2\xb4s a sample\n            => Result = result;\n        \n        public object Result { get; }\n    }\n\n    public sealed class Error : Result\n    {\n        public Error(string message)\n            => Message = message;\n\n        public string Message { get; }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

问题是,与以下内容相比,样板代码太多了F#

\n
type Result =\n    | Ok of result : object\n    | Error of message : string\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
public abstract record Result\n{\n    public sealed record Ok(object result) : Result;\n    public sealed record Error(string message) : Result;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

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

\n

感谢您的帮助和想法!

\n

Jak*_*and 7

我在您的评论和另一篇stackoverflow 文章的帮助下解决了这个问题。

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;
    }
}
Run Code Online (Sandbox Code Playgroud)