我有一个类,用于指示方法调用是否成功(带有值)或出现错误。
internal sealed class ValueOrError<TValue>
{
public bool IsError => _error is not null;
public bool IsSuccess => !IsError;
private TValue? _value;
private Error? _error;
private ValueOrError() { }
public TValue? Value =>
_error is null
? _value
: throw new InvalidOperationException("Is an error type");
public Error Error => _error ?? throw new InvalidOperationException("Not an error type");
public static ValueOrError<TValue> FromValue(TValue? result) =>
new ValueOrError<TValue> { _value = result };
public static ValueOrError<TValue> FromError(Error error) =>
new ValueOrError<TValue> { _error = error ?? throw new ArgumentNullException(nameof(error)) };
public static implicit operator ValueOrError<TValue>(TValue value) => ValueOrError<TValue>.FromValue(value);
public static implicit operator ValueOrError<TValue>(Error error) => ValueOrError<TValue>.FromError(error);
}
我可以很好地进行隐式类型转换,除非 TValue
是一个 IEnumerable<T>
。
// Works
ValueOrError<int> x = 1;
// Fails
ValueOrError<IEnumerable<int>> y = Enumerable.Empty<int>();
无法隐式转换类型'System.Collections.Generic.IEnumerable'为'AppLayer.ValueOrError'
然而,我可以通过“冗长的方式”创建该类型的结果
c# // 可行 ValueOrError<IEnumerable<int>>.FromValue(Enumerable.Empty<int>());
如果有用,Error
的源代码如下
public class Error
{
public string Message { get; }
[JsonConstructor]
public Error(string message)
{
Message = message ?? throw new ArgumentNullException(nameof(message));
}
}
ToArray()
,那么它就可以工作了。如果您想将此作为答案添加,我会很乐意接受它。 - Peter Morris