如何使用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
相关产品推荐
相关产品推荐

