关于表达式“null == <int>”的合法性及Nullable<T>相关疑问
关于的原理解析
null == <int>合法性与Nullable哈哈,这个问题我当初刚接触可空类型的时候也懵过,咱们来把它掰扯清楚~
1. 为什么null == <int>是合法的?
当你写类似null == 10这样的语句时,编译器会自动把右边的int类型值隐式转换为int?(即Nullable<int>)类型——因为null只能和可空值类型或引用类型进行比较。
不过这里有个关键:普通int类型的值永远不可能是null,所以转换后的int?实例的HasValue属性一定是true,和null(等价于HasValue = false的int?实例)比较的结果必然是false,这也是Visual Studio给你绿色高亮提示的原因:“由于int类型的值永远不等于int?类型的null,表达式结果始终为false”。
2. 关于t?.Id的疑问
如果t是null,那么t?.Id确实会返回null,但这里要注意类型细节:
- 如果
Id是int类型,那么t?.Id的结果类型是int?(可空int)——空安全运算符?.会自动把值类型包装成对应的可空类型,这样才能返回null。 - 这时候
null == t?.Id就是两个int?类型的比较,完全合法,当t为null时,结果会是true。
3. Nullable结构体的核心逻辑
Nullable<T>是C#专门为值类型设计的可空包装结构体,它的两个核心成员决定了它的行为:
HasValue:布尔类型,标记当前可空实例是否持有一个有效的T类型值Value:当HasValue为true时,返回对应的T类型值;如果HasValue为false,访问这个属性会直接抛出InvalidOperationException
编译器还给Nullable<T>做了不少语法糖,比如:
- 允许直接把
null赋值给int?变量(等价于创建一个HasValue = false的Nullable<int>实例) - 允许直接把
int值赋值给int?变量(等价于创建一个HasValue = true、Value = 该int值的实例) - 自动处理可空类型与非可空类型的比较、运算等操作
内容的提问来源于stack exchange,提问作者samus
相关产品推荐
相关产品推荐

