我有一个泛型类来表示结果或错误,但不能同时表示两者:

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版本?

推荐答案

这是语言限制.

如果T的类型参数是值类型,则T?引用相同的值类型T.例如,如果T是int,则T?也是一个int.

Csharp相关问答推荐

有没有方法让ASP.NET Core模型绑定器使用私有设置器来设置属性?

C#使用属性和值将JSON转换为XML

如果存在对CodeAnalysis.CSharp的引用,则不能引用netStandard2.0库

AsNoTrackingWithIdentitySolutions()似乎不起作用?

更新产品但丢失产品ASP.NET Core的形象

Nuget包Serilog.Sinks.AwsCloudwatch引发TypeLoadExceptions,因为父类型是密封的

为什么我的表单在绑定到对象时提交空值?

在.NET核心项目中创建Startup.cs比在Program.cs中注册服务好吗?

如何在用户在线时限制令牌生成?

按需无缝转码单个HLS数据段

有没有更好的方法来在CosmosDB上插入非id?

C#多键字典和TryGetValue

使用ASP.NET MVC for Lemon Squeezy X-Signature创建散列

将C#类导入到PowerShell

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

如何阻止可传递依赖项出现在项目中

.NET EF Core Automapper项目到筛选不起作用

我什么时候不应该在Dispose中调用EgSuppressFinalize(This)?

LINQ在GROUP BY和JOIN之后获取子列表