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
相关产品推荐
相关产品推荐

