比较'int'到'null'编译

时间:2013-01-24 03:38:53

标签: c#

  

可能重复:
  C# okay with comparing value types to null

我刚刚在C#(4.0)编译器中找到了一些奇怪的东西。

int x = 0;
if (x == null) // Only gives a warning - 'expression is always false'
    x = 1;

int y = (int)null; // Compile error
int z = (int)(int?)null; // Compiles, but runtime error 'Nullable object must have a value.'

如果你不能将null分配给int,为什么编译器允许你比较它们(它只给出警告)?

有趣的是,编译器不允许以下内容:

struct myStruct
{
};

myStruct s = new myStruct();
if (s == null) // does NOT compile
    ;

为什么struct示例不能编译,但int示例呢?

2 个答案:

答案 0 :(得分:6)

进行比较时,编译器会尝试进行比较,以便比较的两个操作数都具有兼容的类型。

它具有int值和常量null值(没有特定类型)。这两个值之间的唯一兼容类型是int?,因此它们被强制转换为int?并与int? == int?进行比较。作为int的某些int?值肯定是非空的,null肯定是空的。编译器意识到并且由于非空值不等于明确的null值,因此会给出警告。

答案 1 :(得分:1)

实际编译允许比较'int?' 'int'不是'int'到null有意义

e.g。

        int? nullableData = 5;
        int data = 10;
        data = (int)nullableData;// this make sense
        nullableData = data;// this make sense

        // you can assign null to int 
        nullableData = null;
        // same as above statment.
        nullableData = (int?)null;

        data = (int)(int?)null;
        // actually you are converting from 'int?' to 'int' 
        // which can be detected only at runtime if allowed or not

这就是你要在int z = (int)(int?)null;

中做的事情