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

关于表达式“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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:03:07