能否用单个方法实现接收可空类型并返回非可空类型?
单个方法实现接收可空类型并返回非空类型
当然可以用单个方法实现,在C# 8.0及以上版本,结合可空引用类型特性就能搞定,不需要写两个重载。
直接上代码:
public static T Do<T>(T? t) { return t ?? throw new ArgumentNullException(nameof(t)); }
或者更简洁的表达式体写法:
public static T Do<T>(T? t) => t ?? throw new ArgumentNullException(nameof(t));
为什么这个方法能同时处理值类型和引用类型的可空?
- 当
T是值类型时,T?本质是Nullable<T>,??运算符会自动判断:如果t为null(也就是Nullable<T>.HasValue为false)就抛出异常,否则返回t.Value。 - 当
T是引用类型时,T?是可空引用类型的标记,??运算符会检查引用是否为null,为空则抛异常,否则直接返回引用本身。
注意事项
需要在项目中启用可空引用类型:
- 打开项目的
.csproj文件 - 添加或修改
<Nullable>enable</Nullable>配置项,放在<PropertyGroup>节点下
这样编译器还能帮你做静态检查,避免传入不符合要求的参数。
内容的提问来源于stack exchange,提问作者Chris DaMour
相关产品推荐
相关产品推荐

