我有一个泛型类来表示结果或错误,但不能同时表示两者:
public class Result<TValue, TError>
where TValue : notnull
where TError : notnull
{
private readonly bool succeeded;
private readonly TValue? value;
private readonly TError? error;
public static Result<TValue, TError> Success(TValue value) =>
new(true, value ?? throw new ArgumentNullException(nameof(value)), default);
public static Result<TValue, TError> Failure(TError error) =>
new(false, default, error ?? throw new ArgumentNullException(nameof(error)));
protected Result(bool succeeded, TValue? value, TError? error)
{
this.succeeded = succeeded;
this.value = value;
this.error = error;
}
public bool Successful(
[NotNullWhen(true)] out TValue? value,
[NotNullWhen(false)] out TError? error)
{
if (succeeded)
{
value = this.value!;
error = default;
return true;
}
else
{
value = default;
error = this.error!;
return false;
}
}
}
这是我想要的课程.例如,如果TValue为object
,则value
字段和value
参数为object?
.然而,我已经意识到,当泛型类型参数是值类型时,用?
修饰它并不能使其变为Nullable
.这大概是因为这样做会更改基础类型,而不仅仅是对其可空性进行注释.有没有办法引用泛型类型的Nullable
版本?