如何用单个方法实现T?(T为值/引用类型)转非Nullable的Result<T>?
单个泛型方法实现接收T?并返回非空T的成功Result
可以用单个泛型方法解决这个问题,核心是利用C#的可空类型流分析和泛型约束,让编译器自动识别非空值的场景,无需拆分针对值类型和引用类型的重载。
第一步:定义Result基础结构(确保成功结果仅接受非空值)
先明确Result的结构,让成功结果的Success方法只接受非空类型:
public abstract class Result { public bool IsSuccess { get; protected init; } public bool IsFailure => !IsSuccess; // 失败结果 public static Result Failure() => new FailureResult(); // 成功结果:约束T为非空类型 public static Result<T> Success<T>(T value) where T : notnull => new SuccessResult<T>(value); } public sealed class FailureResult : Result { public FailureResult() => IsSuccess = false; } public sealed class SuccessResult<T> : Result where T : notnull { public T Value { get; } public SuccessResult(T value) { IsSuccess = true; Value = value; } }
第二步:实现单个泛型处理方法
编写一个接收T?的泛型方法,通过value is not null的模式匹配触发编译器流分析,自动确认非空值的有效性:
public static Result<T> ProcessNullableValue<T>(T? value) { if (value is null) { return Result.Failure(); } // 编译器通过流分析确认:此处value必定非空,符合Success<T>的非空约束 return Result.Success(value); }
原理说明
- 对于值类型的
T?(即Nullable<T>),value is null等价于检查Nullable<T>.HasValue == false; - 对于引用类型的
T?(可空引用类型),value is null直接判断引用是否为空; - C#的流分析会在跳过
null分支后,自动将value的可空状态从T?提升为T(非空),因此可以安全传递给要求notnull约束的Result.Success<T>方法。
这个方法无需拆分重载,即可同时兼容值类型和引用类型的输入场景。
内容的提问来源于stack exchange,提问作者Xavier John
相关产品推荐
相关产品推荐

