You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

泛型方法中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 04:00:55