为什么在C#中将结构与NULL合法进行比较?

Ang*_*ker 1 c# null struct

可能重复:
C#可以将值类型与null进行比较

使用TimeSpan考虑以下代码,TimeSpan是一个结构:

// will not compile - illegal
TimeSpan ts = null;  
Run Code Online (Sandbox Code Playgroud)

但是,以下代码确实编译并且是合法的,尽管表达式始终为false:

if (ts == null)
    Console.WriteLine("this line will never be hit");
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么将结构设置为NULL是无效的,但可以将它与一个进行比较吗?

Ry-*_*Ry- 7

它仍然合法,因为你可以==structs 重载运算符.

struct AmNull {
    public static bool operator ==(AmNull a, object b) {
        return b == null;
    }

    public static bool operator !=(AmNull a, object b) {
        return b != null;
    }
}

...

Console.WriteLine(new AmNull() == null); // True
Run Code Online (Sandbox Code Playgroud)

  • @AngrHacker:我认为你应该选择这个回答作为公认的答案.它涵盖了我的回答,但扩展了它以解释为什么会出现这种行为. (3认同)