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

为什么在C#中将结构与NULL进行比较是合法的?,c#,struct,null,C#,Struct,Null,可能重复: 考虑以下带有TimeSpan的代码,它是一个结构: // will not compile - illegal TimeSpan ts = null; 但是,以下代码确实可以编译并且是合法的,尽管表达式始终为false: if (ts == null) Console.WriteLine("this line will never be hit"); 有人能告诉我为什么将结构设置为空是无效的,但将其与空进行比较是可以的吗?无法为我编译: struct Foo { }

可能重复:

考虑以下带有TimeSpan的代码,它是一个结构:

// will not compile - illegal
TimeSpan ts = null;  
但是,以下代码确实可以编译并且是合法的,尽管表达式始终为false:

if (ts == null)
    Console.WriteLine("this line will never be hit");

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

无法为我编译:

struct Foo { }

class Program
{       
    static void Main( string[] args )
    {
        var f = new Foo();
        if( f == null ) { }
    }
}
错误1运算符“==”不能应用于“ConsoleApplication3.Foo”和“null”类型的操作数


它仍然是合法的,因为您可以为
struct
s重载
=
操作符

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

,若你们不能将结构和null进行比较,那个么你们会如何处理null?@AnthonyPegram:更好的问题是;如何将
Nullable
实现为
struct
?(当然,你不能)<代码>可空当然可以作为参考实现type@EdS.但是
Nullable
是一个结构体。@phoog:对,这就是我的意思:)@AngryHacker:这是因为
TimeSpan
重载了
=
操作符(一开始我没有捕捉到)。我的观点是,你的问题“为什么在C#中将结构与NULL进行比较是合法的?”是不完整的;不能,除非重载相等运算符以接受它。minitech有更好的回答。@AngrHacker:我认为你应该选择这个回答作为公认的答案。它涵盖了我的回答,但进一步解释了为什么会出现这种行为。