为什么整数== null是C#中有效的布尔表达式?

时间:2013-06-18 21:43:45

标签: c# null boolean non-nullable

如果integer == null(类型为integer的变量)不可为空,为什么int是C#中的有效布尔表达式? (我不是反对它,事实上我喜欢它,但我不知道这是可能的)

2 个答案:

答案 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编译器的三种结果之一:

  • 警告CS0472(例如int
  • 错误CS0019(自定义类型不会超载==
  • 清除编译(超载==的自定义类型,包括GuidDateTime

我不清楚为什么编译器会将某些“已知”类型与普通结构区别对待。编辑:正如Eric在评论中所指出的,这是C#编译器中的已知错误,希望在Roslyn中修复。

答案 1 :(得分:1)

正如Ed提到的那样有警告,但警告提到了原因:int可以自动投放到int?null是类型变量的有效值int?