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

C#可空泛型类型的意外行为及原因咨询

C#可空泛型T?默认值行为解析

你的代码里第三个方法MyFunctionGenericNullable<int>()返回0而非预期的null,核心原因是C#对泛型中T?的解析逻辑会根据T的类型(值类型/引用类型)产生不同语义:

1. 明确可空值类型的默认值

MyFunction()的返回类型是int?(即Nullable<int>),这是明确的可空值类型,default对于可空值类型的定义就是null,所以返回null符合预期。

2. 泛型参数为可空值类型的情况

MyFunctionGeneric<int?>()中,泛型参数T是int?,default(T)就是int?的默认值null,所以返回null也符合预期。

3. 泛型返回值T?的关键规则

重点看MyFunctionGenericNullable<T>()的返回类型T?:

  • 当T是引用类型时,T?表示可空引用类型,default(T?)为null。
  • 当T是值类型时,T?并不是创建Nullable<T>,而是在C#的可为空引用类型上下文里,给值类型添加空值检查的标记——但底层类型依然是T本身。此时default(T?)等价于default(T),也就是值类型的默认值(比如int的0)。

当你调用MyFunctionGenericNullable<int>()时,T是值类型int,所以T?本质还是int,default(T?)自然就是0。而如果传入int?作为泛型参数,T是可空值类型,T?会被直接解析为T(因为可空值类型本身已经支持null),此时default(T?)就是int?的默认值null。

哪怕你显式写return default(T?),只要T是值类型,编译时T?会被处理为T,所以结果还是值类型的默认值。

内容的提问来源于stack exchange,提问作者msheridan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 15:47:16