我刚刚在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
示例呢?
答案 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;