C# 列表<;T>;运算符==在C语言规范版本4中

C# 列表<;T>;运算符==在C语言规范版本4中,c#,list,operators,C#,List,Operators,在C语言规范第4版中,1.6.7.5操作符是关于列表操作符的信息:=和=。但是我找不到在列表中定义的此类运算符?我错过什么了吗 来自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 "Tr

在C语言规范第4版中,1.6.7.5操作符是关于
列表
操作符的信息:
=
=。但是我找不到在
列表中定义的此类运算符?我错过什么了吗

来自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"
List a=新列表();
a、 增加(1);
a、 增加(2);
列表b=新列表();
b、 增加(1);
b、 增加(2);
Console.WriteLine(a==b);//输出“True”=>这里我也得到False
b、 增加(3);
Console.WriteLine(a==b);//输出“假”
列表
是一种引用类型,它不会重载
运算符==
。因此,它使用默认的引用相等语义。您似乎觉得它覆盖了
operator==
,以提供值语义,但事实并非如此<当
a
b
都引用相同的
列表时,code>a
将等于
b

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

List类声明了两个运算符,运算符==和运算符!=,从而为将这些运算符应用于列表实例的表达式赋予了新的含义。具体来说,操作符将两个列表实例的相等定义为使用其Equals方法比较每个包含的对象。下面的示例使用==运算符比较两个列表实例

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


EDIT2:反编译的
列表
,无
运算符==
和/或
运算符=过载。在这种情况下,规范似乎完全不正确。

规范确实正确,但令人困惑。规范定义了一个名为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;
}
静态布尔等于(列表a、列表b){
如果(a==null)返回b==null;
如果(b==null | | a.count!=b.count)返回false;
for(int i=0;i
请更清楚地解释您的问题请不要在“我希望…”中说“输出”:@pst此代码是从语言规范以及注释中逐字复制和粘贴的。语言规范另有说明:List类声明了两个运算符,运算符==和运算符!=,从而为将这些运算符应用于列表实例的表达式赋予了新的含义。具体来说,操作符将两个列表实例的相等定义为使用其Equals方法比较每个包含的对象。“@dasblinkenlight:你说得对,我现在正在读。试图理解它…@DanielDusek:是的,我刚刚把它添加到我的帖子中。这似乎是不正确的。现实与规范不符。@JamesMichaelHare:这里也一样(不得不四处寻找一个工作版本的反射器…)。在这一点上,规范似乎是完全错误的。是的,我的想法是,规范试图说明问题,并选择了一个不好的例子。不过,规范的这一点并不是说
List
必须支持这些操作符,它只是一个错误的例子,假设它支持这些操作符。。。