List <t> operator ==在C#语言规范版本4 </t>中

时间:2012-08-07 19:16:50

标签: c# list operators

在C#语言规范第4版中,1.6.7.5运算符是关于List<T>运算符的信息:==!=。但我找不到List<T>中定义的这类运算符?我错过了什么吗?

1.6.7.5运营商的示例代码:

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"

2 个答案:

答案 0 :(得分:22)

List<T>是一种不会超载operator==的引用类型。因此,它使用默认引用相等语义。您似乎认为它会覆盖operator==以提供值语义,但事实并非如此。当ab都引用相同的a实例时,b将等于List<T>

编辑:所以我自己查看了规范。它说:

  

List类声明了两个运算符,operator ==和operator!=,因此为将这些运算符应用于List实例的表达式赋予了新的含义。具体来说,运算符定义两个List实例的相等性,以使用它们的Equals方法比较每个包含的对象。以下示例使用==运算符来比较两个List实例。

老实说......我不知道他们在谈论什么,但这似乎不正确。据我所知,在运行一些测试后,List<T>类使用引用相等性。好问题。

EDIT2:已解压缩List<T>,没有operator==和/或operator!=重载。在这种情况下,规范似乎完全不正确。

答案 1 :(得分:17)

规范确实是正确的,虽然令人困惑。规范定义了一个名为List(不良命名选择)的类。

  

下表显示了一个名为List的泛型类,它实现了一个可增长的对象列表。该类包含几种最常见的函数成员的例子。

该类可在1.6.7节的规范中看到。 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;
}