2012-04-09 105 views
1

可能重複:
C# okay with comparing value types to null爲什麼要在C#中將結構與NULL合法比較?

考慮與時間跨度,這是一個結構下面的代碼:

// will not compile - illegal 
TimeSpan ts = null; 

但是,下面的代碼不會編譯和合法,儘管表達總是假的:

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

有人可以告訴我爲什麼將結構設置爲NULL是無效的,但可以將它與一個結果比較嗎?

+0

http://stackoverflow.com/questions/2022425/comparing-structs-to-null,http://stackoverflow.com/questions/648115/how-can-an-object-not-be-比較爲null,http://stackoverflow.com/questions/1225949/why-can-timespan-and-guid-structs-be-compared-to-null,http://stackoverflow.com/questions/1972262/ c-sharp-okay-with-comparison-value-types-null- – nawfal 2012-04-09 23:44:31

+0

如果無法將結構與null進行比較,那麼將如何處理Nullable ? – 2012-04-09 23:46:19

+0

@AnthonyPegram:更好的問題是;你將如何實現'Nullable '作爲'struct'? (當然,你不能)。 'Nullable ''當然可以作爲參考類型來實現 – 2012-04-10 00:02:06

回答

3

編譯失敗對我來說:

struct Foo { } 

class Program 
{  
    static void Main(string[] args) 
    { 
     var f = new Foo(); 
     if(f == null) { } 
    } 
} 

錯誤1操作 '==' 不能應用於類型 'ConsoleApplication3.Foo' 和 '空' 的操作數

+0

嘗試TimeSpan而不是Foo – AngryHacker 2012-04-09 23:44:34

+0

@AngryHacker:這是因爲'TimeSpan'重載'=='操作符(我一開始並沒有明白)。我的觀點是你的問題「爲什麼要在C#中將結構與NULL合法比較?」不完整;你不能,除非你讓相等運算符超載來接受它。 minitech有更好的反應。 – 2012-04-09 23:45:39

7

它仍然合法,因爲您可以爲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 
+3

@AngrHacker:我想你應該選擇這個答案作爲接受的答案。它涵蓋了我的迴應,但擴展了它的解釋爲什麼會出現這種行爲。 – 2012-04-10 17:00:48