这句话似乎有效,但我不确定
究竟是怎样的int id = 0; // non-nullable ("primative"/value-type/struct)
_list?.Find(t => { return t?.Id == id; })?.DeptId ?? 0;
如果t
null
,那么t?.Id
null
,是吗?
那怎么合法:
null == id
更新(5/8/18)
视觉工作室的声明
if (null == 0) {}
突出显示为绿色,并在用状态检查
时检查"表达式的结果总是“假”'因为类型' int'的值绝不等于' null'类型' int?'
更新(5/24/18)
Nullable
<T>
Struct基本属性
Nullable结构的两个基本成员是 HasValue和Value属性。如果HasValue属性为 Nullable对象为true,可以访问对象的值 使用Value属性。如果HasValue属性为false,则为值 对象的未定义和尝试访问Value属性 抛出InvalidOperationException。
装箱和拆箱
当装入可空类型时,公共语言运行时 自动封装Nullable对象的基础值, 不是Nullable对象本身。也就是说,如果是HasValue属性 如果是这样,则Value属性的内容将被加框。当。。。的时候 可空类型的基础值是未装箱的,即通用语言 运行时创建一个初始化为的新Nullable结构 潜在价值。
如果可空类型的HasValue属性为false,则结果为a 装箱操作为空。因此,如果是盒装可空类型 传递给一个期望对象参数的方法,该方法必须 准备好处理参数为null的情况。当为null时 取消装入可以为空的类型,公共语言运行库创建一个 新的Nullable结构并将其HasValue属性初始化为 假的。
REF: https://docs.microsoft.com/en-us/dotnet/api/system.nullable-1?view=netframework-4.7.2
答案 0 :(得分:3)
来自C# 5.0 spec(第7.3.7节解除运营商):
对于相等运算符
== !=
如果操作数类型都是非可空值类型且结果类型为bool,则存在提升形式的运算符。提升形式是通过添加一个?每个操作数类型的修饰符。提升的运算符认为两个空值相等,并且空值不等于任何非空值。如果两个操作数都是非null,则提升的运算符将解包操作数并应用基础运算符来生成bool结果。
因此,使用了提升的运算符int? == int?
。由于左侧是null
而右侧不是,因此操作员返回false
。