You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用CSharpFunctionalExtensions创建仅含泛型错误类型的Result类型

使用CSharpFunctionalExtensions创建带错误类型但无成功类型的Result

我想在CSharpFunctionalExtensions中创建一个包含错误类型但没有特定成功类型的Result(我只需要用Result.IsSuccess判断状态就够了)。但我试了下面的代码,发现会丢失Error泛型类型参数的信息:

private Result Validate()
{
    if(false)
    {
        return Result.Failure<Error>(new Error
        {
            Code = "ERROR_CODE",
            Message = "ERROR_MESSAGE"
        });
    }
    
    return Result.Success();
}

解决方案

CSharpFunctionalExtensions中默认的Result是不带泛型错误信息的,要保留错误的强类型,你需要用**Result<Unit, TError>**来表示「无成功值但有强类型错误」的结果——其中Unit是框架提供的空值类型,专门用来标记无返回值的场景。

修改后的代码如下:

using CSharpFunctionalExtensions;

private Result<Unit, Error> Validate()
{
    if (false)
    {
        return Result.Failure<Unit, Error>(new Error
        {
            Code = "ERROR_CODE",
            Message = "ERROR_MESSAGE"
        });
    }

    return Result.Success<Unit, Error>(Unit.Value);
}

如果觉得Result<Unit, Error>写起来繁琐,可以自定义一个类型别名简化代码:

using ValidationResult = CSharpFunctionalExtensions.Result<CSharpFunctionalExtensions.Unit, Error>;

private ValidationResult Validate()
{
    if (false)
    {
        return Result.Failure<Unit, Error>(new Error
        {
            Code = "ERROR_CODE",
            Message = "ERROR_MESSAGE"
        });
    }

    return Result.Success<Unit, Error>(Unit.Value);
}

问题原因说明

你原来返回的非泛型Result是所有Result类型的基类,当你返回Result.Failure<Error>时,会被隐式转换为非泛型Result,导致错误的强类型信息被丢失。而Result<Unit, TError>既明确了「无成功返回值」的语义,又能完整保留错误的泛型类型信息,完全匹配你的需求。

内容的提问来源于stack exchange,提问作者me.at.coding

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:24:54