【发布时间】:2020-03-10 03:29:55
【问题描述】:
我正在尝试创建类似于 Rust 的 Result 或 Haskell 的 Either 的类型,我已经做到了这一点:
public struct Result<TResult, TError>
where TResult : notnull
where TError : notnull
{
private readonly OneOf<TResult, TError> Value;
public Result(TResult result) => Value = result;
public Result(TError error) => Value = error;
public static implicit operator Result<TResult, TError>(TResult result)
=> new Result<TResult, TError>(result);
public static implicit operator Result<TResult, TError>(TError error)
=> new Result<TResult, TError>(error);
public void Deconstruct(out TResult? result, out TError? error)
{
result = (Value.IsT0) ? Value.AsT0 : (TResult?)null;
error = (Value.IsT1) ? Value.AsT1 : (TError?)null;
}
}
鉴于这两种类型参数都被限制为notnull,为什么它会抱怨(任何地方都有一个带有可空? 符号的类型参数):
必须知道可空类型参数是值类型或不可空引用类型。考虑添加“类”、“结构”或类型约束。
?
我在 .NET Core 3 上使用 C# 8,并启用了可为空的引用类型。
【问题讨论】:
-
您应该从 F#'s 结果类型开始,并区分联合。您可以在 C# 8 中轻松实现类似的功能,无需 携带死值,但您不会进行详尽的匹配。尝试将 两种 类型放在同一个结构中会遇到一个接一个的问题,并带回 Result 应该解决的问题
标签: c# generics type-constraints c#-8.0 nullable-reference-types