如何用单个C#函数返回任意T类型的可空值?
如何用单个C#函数处理值类型和引用类型的可空逻辑
一、单个函数返回任意类型的"空值"
可以直接利用C#的可空泛型语法,无需分开处理值类型和引用类型:
private static T? GetNull<T>() { return default; }
- 对于引用类型(如
string),T?表示可空引用类型,default(T?)等价于null; - 对于值类型(如
int),T?等价于Nullable<T>,default(T?)会返回处于null状态的可空值类型实例,和直接返回null效果一致。
二、合并可空加载器函数
同理,我们可以将两个类型专属的加载器函数合并为一个通用函数:
private static Func<string, T?> NullableLoader<T>(Func<string, T> innerLoader) { return text => string.IsNullOrWhiteSpace(text) ? default(T?) : innerLoader(text); }
修改后的单元测试可以统一调用这个函数,无需区分值类型或引用类型:
[Fact] public void Test1() { Assert.Equal(123, IntLoader("123")); Assert.Equal("xyz", StringLoader(" xyz ")); Assert.Null(NullableLoader(IntLoader)("")); Assert.Null(NullableLoader(StringLoader)("")); }
原理说明
这个写法的核心是利用C# 8及以后引入的可空引用类型和可空值类型的统一语法:
- 当
T是值类型时,T?自动映射为Nullable<T>; - 当
T是引用类型时,T?表示该引用可以为null; default(T?)会根据T的类型自动生成对应的"空值":值类型返回可空实例的null状态,引用类型返回null。
此写法在C# 10中完全支持,升级到C# 11后也无需修改。
内容的提问来源于stack exchange,提问作者THX-1138
相关产品推荐
相关产品推荐

