2009-10-08 30 views
2

我在這裏談論C#語言。在msdn的Object.Equals(Object)方法的是可空的<T>。等式方法實現錯誤?

定義是:

確定指定 Object是否等於當前的Object。

如果兩個對象相等,則返回true,但是如果他們是null,則返回false:

x.Equals(空引用(在 Visual Basic中爲Nothing))返回false。

爲什麼?因爲null不是一個對象。

如果對象參數是空值,則拋出NullReferenceException。

和我們也有這樣的:

x.Equals(y)返回相同的值 y.Equals(X)。

直到這裏都沒問題。它與Java非常相似。但C#還爲非空類型提供了System.Nullable結構。據我所知,一個結構是一個對象。它繼承Object.Equals方法。

如果我有這樣的結構:

struct Car 
    { 
     public string Make; 
     public string Model; 
     public uint Year; 

     public Car(string make, string model, uint year) 
     { 
      Make = make; 
      Model = model; 
      Year = year; 
     } 
    } 

,打造四個實例:

Car car1 = new Car("make", "model", 2009); 
Car car2 = new Car("make", "model", 2009); 
Car car3 = new Car("make", "model", 2008); 

car1.Equals(car2); // will return true 
car1.Equals(car3); // will return false; 

而且據我所知,我們不能設置一個結構爲空值。但是System.Nullable是一個結構,我們可以做編譯這個沒有任何錯誤:

int? i = null; 

(?我希望有人能也解釋了這個它是一個結構或其他什麼東西)

我真正的問題是:

i.Equals(null); // returns true! 

(通常x.Equals(Y)= y.Equals(X)當然null.Equals(I)的無效這裏...)

顯然的Object.Equals方法在這裏重寫。也許它被記錄下來,並且這是特定的。但是這種方法是正確的還是很好的?如果是這樣,==和Equals方法之間的Nullable值有什麼區別?

回答

9

我覺得你的困惑是植根於以下行

i? = null; 

這並不真正創建一個空值的變量。它基本上是以下的合成糖:

Nullable<int> i = new Nullable<int>(); 

生成的HasValue屬性值爲false。它不是null,而是一個空值的值類型。或者只是一個空的空值。恕我直言,最好的辦法是這樣的,null可以轉換爲空的Nullable<T>對於任何給定的T.

知道它使行i.Equals(null)有點容易理解。這是語法糖以下

Nullable<int> i = new Nullable<int>(); 
i.Equals(null); 

類型Nullable<T>只覆蓋的equals(對象)。雖然此方法的實現認爲空值等於空的可空值。所以它的行爲是正確的。

+0

但是,無論它在後臺我們調用i.Equals(null),並且當我爲null時它會返回true。它應該返回false爲其他對象。 – JCasso 2009-10-08 23:50:48

+0

@jcasso,Nullable的一般...都很奇怪,而且往往以意想不到的方式行事。部分困惑是我永遠不能爲空,因爲它實際上是一個值類型。最好把它看作是一個空的可空對象。 – JaredPar 2009-10-08 23:52:07

+0

至少你接受它是奇怪的:)我以爲我是唯一的一個。 – JCasso 2009-10-08 23:53:43

2

爲了回答你的問題,Nullable是一個帶有T:Struct約束的結構。那麼,即使int? i = null;是空的,我是Nullable結構的一個實例。

+0

結構可能會採用空值?你可以定義Car car4 = null; ? – JCasso 2009-10-08 23:52:22

+1

就CLR而言,Struct不能有'null'值。在C#中,當你寫'int? x = null',你實際上正在寫'int? x = new int?()'。根本沒有真正的'空'。 – 2009-10-08 23:56:53

+1

沒有。但是當你做int?我=「某些合法價值」,CLR將這種合法價值放入i的價值屬性中。此外,只是FYI,Nullable會覆蓋Equals方法 – 2009-10-08 23:57:10

相關問題