8

可能重复:
C# 可以将值类型与 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示例可以?

4

2 回答 2

6

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

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

于 2013-01-24T03:52:47.657 回答
1

实际上编译允许比较'int?to 'int' not 'int' to null 有意义

例如

        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;

于 2013-01-24T03:58:59.790 回答