为什么integer == null
C# 中的有效布尔表达式,如果integer
(类型的变量int
)不可为空?(我不反对,其实我很喜欢,但我不知道这是可能的)
问问题
671 次
2 回答
19
尽管int
它本身是不可为空的,但是有一个隐式转换为int?
,它是可以为空的。
那时,如果结构==
在两边都声明了一个具有相同类型的运算符,那么它也可以用于可空类型。
所以这不会编译:
public struct Foo {}
class Test
{
static void Main()
{
Foo x = new Foo();
if (x == null)
{
...
}
}
}
...但如果你给Foo
一些运算符,它会编译,并且没有警告:
public struct Foo
{
public static bool operator ==(Foo x, Foo y) { return true; }
public static bool operator !=(Foo x, Foo y) { return false; }
public override bool Equals(object x) { return false; }
public override int GetHashCode() { return 0; }
}
运算符调用不包含在编译代码中,因为编译器知道RHS 为空。
因此,上述形式的代码(其中Foo
可以替换为任何 non-nullable struct
)具有 MS C# 5 编译器的三个结果之一:
- 警告 CS0472(例如带有
int
) - 错误 CS0019(不重载的自定义类型
==
) - 干净的编译(重载的自定义类型
==
,包括Guid
andDateTime
)
我不清楚为什么编译器将某些“已知”类型与普通结构不同地对待。编辑:正如 Eric 在评论中所指出的,这是 C# 编译器中的一个已知错误,希望在 Roslyn 中得到修复。
于 2013-06-18T21:49:03.370 回答
1
正如 Ed 提到的那样,有一个警告,但警告暗示了原因:int
可以自动转换为int?
,并且null
是类型变量的有效值int?
。
于 2013-06-18T21:49:24.970 回答