Jak*_*and 20 c# f# record discriminated-union
你好,
\nI\xc2\xb4m 尝试discriminated union type
在 C# 中重建 a 。
\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#
:
type Result =\n | Ok of result : object\n | Error of message : string\n
Run Code Online (Sandbox Code Playgroud)\n所以我尝试在 C#9 的帮助下重建类型records
。
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我在您的评论和另一篇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)