泛型方法中null与默认值的区分及引用类型null检查方案
解决方案
方法1:运行时判断类型并执行null检查
无需修改方法约束或复制方法,直接在方法内通过类型筛选,仅对引用类型做null判断:
void Foo<T>(T a) { // 仅针对引用类型执行null检查 if (!typeof(T).IsValueType && a == null) { // 此处编写null值的处理逻辑 } }
补充说明
typeof(T).IsValueType会在T是值类型(包括int、DateTime、可空值类型int?等)时返回true,因此!typeof(T).IsValueType可精准筛选出所有引用类型。- 可空值类型虽能通过
a == null判断是否无值,但我们通过!IsValueType已将其排除,完全符合你“不对值类型做无效检查”的需求。
若使用C# 7.0及以上版本,可改用更直观的IsReferenceType:
void Foo<T>(T a) { if (typeof(T).IsReferenceType && a == null) { // 处理null逻辑 } }
方法2:利用C# 9.0+模式匹配
如果你的项目使用较新版本C#,可以用is null模式匹配简化代码,它会自动跳过值类型的无效检查:
void Foo<T>(T a) { if (a is null) { // 仅当a是引用类型且为null时,才会进入此分支 // 值类型(含可空值类型)永远不会匹配该模式 } }
原理说明
is null模式匹配会在编译阶段就识别类型差异:
- 对引用类型等价于常规null检查;
- 对值类型直接判定为
false,不会生成无效的运行时检查代码,零额外开销。
内容的提问来源于stack exchange,提问作者codymanix
相关产品推荐
相关产品推荐

