C# “c”==&引用;运算符:不同结构的编译器行为

C# “c”==&引用;运算符:不同结构的编译器行为,c#,.net,C#,.net,用于说明的代码: public struct MyStruct { public int SomeNumber; } public string DoSomethingWithMyStruct(MyStruct s) { if (s == null) return "this can't happen"; else return "ok"; }

用于说明的代码:

    public struct MyStruct
    {
        public int SomeNumber;
    }

    public string DoSomethingWithMyStruct(MyStruct s)
    {
        if (s == null)
            return "this can't happen";
        else
            return "ok";
    }

    private string DoSomethingWithDateTime(DateTime s)
    {
        if (s == null)
            return "this can't happen";  // XX
        else
            return "ok";
    }
现在,“DoSomethingWithStruct”无法编译,原因是:“运算符“==”不能应用于“MyStruct”和“
”类型的操作数。”。这是有意义的,因为尝试与结构(一种值类型)进行引用比较是没有意义的

OTOH,“DoSomethingWithDateTime”编译,但在标记为“XX”的行中出现编译器警告:“检测到无法访问的代码”。现在,我假设这里没有编译器错误,因为DateTime结构重载了“==”运算符。但是编译器如何知道代码是不可访问的呢?e、 g.它是否查看重载“==”运算符的代码内部?(这是使用VisualStudio2005,以防产生影响)

注:我对上述情况比任何事情都好奇。我通常不会尝试使用“==”来比较结构和空值


编辑:我将尝试简化我的问题-为什么“DoSomethingWithDateTime”编译,而“DoSomethingWithMyStruct”不编译。这两个参数都是结构。

因为DateTime是一个结构,所以不能为null。没有办法重写结构的==运算符,使第二个参数为null。

正如Hun1Ahpu所说,它永远不能为null

但是,您可以提供自己的==运算符,该运算符可以将对象作为参数类型,从而允许编译上述代码


显然,您需要它来做一些逻辑上的事情。

它知道一个结构从来都不是空的(
Nullable
);这足以发出警告

在这方面有一个已知的编译器问题,它出现在C#2.0编译器和C#3.0编译器之间(目前仍在C#4.0编译器中)[我不知道为什么您会在VS2005上看到它]。相等性测试不会对具有
==
/
的自定义结构发出无法访问的代码警告=运算符
DateTime
具有这些运算符;你的结构没有-因此不同


编译器团队(他们渴望在有机会的时候解决这个问题)最近对这个问题进行了研究。

我不确定这就是原因
System.Int32
没有显式的
=
运算符,但是您可以合法地将其与
null
..@aaronaugh我说过“自定义结构”。。。我在这里排除了原语,因为它们在语言本身中有单独的规则。