是否可以使用私有构造函数创建 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;
}
}
您好,
我正在尝试用 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;
}
}