C# 列表<;T>;运算符==在C语言规范版本4中
在C语言规范第4版中,1.6.7.5操作符是关于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
列表
操作符的信息:=
和=代码>。但是我找不到在列表中定义的此类运算符?我错过什么了吗
来自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
必须支持这些操作符,它只是一个错误的例子,假设它支持这些操作符。。。