如果integer == null
(类型为integer
的变量)不可为空,为什么int
是C#中的有效布尔表达式? (我不是反对它,事实上我喜欢它,但我不知道这是可能的)
答案 0 :(得分: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
可以被任何非可空的struct
替换)具有MS C#5编译器的三种结果之一:
int
)==
)==
的自定义类型,包括Guid
和DateTime
)我不清楚为什么编译器会将某些“已知”类型与普通结构区别对待。编辑:正如Eric在评论中所指出的,这是C#编译器中的已知错误,希望在Roslyn中修复。
答案 1 :(得分:1)
正如Ed提到的那样有警告,但警告提到了原因:int
可以自动投放到int?
,null
是类型变量的有效值int?
。