2012-08-07 41 views
20

在C#語言規範版本4中,1.6.7.5運營商是關於List<T>運營商的信息:==!=。但我找不到List<T>中定義的這些運算符?我錯過了什麼嗎?從1.6.7.5算List <T> operator ==在C#語言規範版本4中

樣品的編號:

List<int> a = new List<int>(); 
a.Add(1); 
a.Add(2); 
List<int> b = new List<int>(); 
b.Add(1); 
b.Add(2); 
Console.WriteLine(a == b); // Outputs "True" => here I get False as well 
b.Add(3); 
Console.WriteLine(a == b); // Outputs "False" 
+0

請更清楚地解釋 – darnir 2012-08-07 19:18:43

+5

你的問題請不要說「輸出」爲「我會把它想。」 :) – 2012-08-07 19:19:07

+8

@pst這段代碼複製,並從語言規範逐字粘貼,隨着評論。 – dasblinkenlight 2012-08-07 19:26:16

回答

17

該規範確實是正確的,雖然令人困惑。該規範定義了一個名爲List的類(差名稱選擇)。

下表顯示了一個名爲List的泛型類,該類實現了可擴展的對象列表。該類包含幾個最常見類型的函數成員的例子。

這個類可以在1.6.7節的spec中看到。 Equals運算符超載並且匹配上面解釋的輸出。也許應該爲這個班級選擇一個更好的名字。

static bool Equals(List<T> a, List<T> b) { 
    if (a == null) return b == null; 
    if (b == null || a.count != b.count) return false; 
    for (int i = 0; i < a.count; i++) { 
     if (!object.Equals(a.items[i], b.items[i])) { 
      return false; 
     } 
    } 
    return true; 
} 
21

List<T>是不超載operator==引用類型。因此,它使用默認的引用相等語義。您似乎認爲它會覆蓋operator==以提供值語義,但它不會。 a將等於bab都指代相同的List<T>實例。

編輯:所以我看着規格自己。它說:

List類聲明瞭兩個運算符operator ==和operator!=,因此爲將這些運算符應用於List實例的表達式賦予新的含義。具體來說,操作符將兩個List實例的相等性定義爲使用它們的Equals方法比較每個包含的對象。以下示例使用==運算符來比較兩個List實例。

老實說......我不知道他們在說什麼,但這看起來並不正確。據我所知,在運行一些測試之後,List<T>類使用了引用等式。好問題。

編輯2:反編譯List<T>,編號operator==和/或operator!=過載。該規範在這種情況下似乎完全不正確。

+1

語言規範另有說明:「列表類聲明瞭兩個運算符operator ==和operator!=,從而爲將這些運算符應用於List實例的表達式賦予新的含義。具體來說,運算符定義了兩個實例的相等性。用它們的Equals方法比較每個包含的對象。「 – dasblinkenlight 2012-08-07 19:22:08

+0

@dasblinkenlight:你說得對,我正在閱讀。試圖理解它... – 2012-08-07 19:22:40

+0

@DanielDusek:是的,我剛剛添加到我的帖子。這似乎是不正確的。現實不符合規範。 – 2012-08-07 19:25:24