评估&#34; null == <int>&#34;

时间:2018-03-08 15:48:14

标签: c#

这句话似乎有效,但我不确定

究竟是怎样的
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) {}

突出显示为绿色,并在用状态检查

时检查
  

&#34;表达式的结果总是“假”&#39;因为类型&#39; int&#39;的值绝不等于&#39; null&#39;类型&#39; int?&#39;

更新(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

1 个答案:

答案 0 :(得分:3)

来自C# 5.0 spec(第7.3.7节解除运营商):

  

对于相等运算符

==  !=
     

如果操作数类型都是非可空值类型且结果类型为bool,则存在提升形式的运算符。提升形式是通过添加一个?每个操作数类型的修饰符。提升的运算符认为两个空值相等,并且空值不等于任何非空值。如果两个操作数都是非null,则提升的运算符将解包操作数并应用基础运算符来生成bool结果。

因此,使用了提升的运算符int? == int?。由于左侧是null而右侧不是,因此操作员返回false