List operator ==在C#语言规范版本4中

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

1.6.7.5运算符的示例代码:

 List a = new List(); a.Add(1); a.Add(2); List b = new List(); 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" 

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

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

这个类可以在1.6.7节的规范中看到。 Equals运算符过载并与上面解释的输出匹配。 也许应该为该课程选择一个更好的名字。

 static bool Equals(List a, List 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; } 

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

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

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

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

EDIT2:反编译List ,没有operator==和/或operator!=重载。 在这种情况下,规范似乎完全不正确。