Список операторов <T> == В спецификации языка С# версии 4
В С# Language Specification Version 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"
Ответы
Ответ 1
Спектр действительно правильный, хотя и запутанный. Спецификация определяет класс 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;
}
Ответ 2
List<T>
является ссылочным типом, который не перегружает operator==
. Поэтому он использует стандартную семантику равенства ссылок. Кажется, у вас создается впечатление, что он переопределяет operator==
, чтобы обеспечить семантику значений, но это не так. a
будет равен b
, когда a
и b
оба относятся к тому же экземпляру List<T>
.
РЕДАКТОР: Итак, я сам посмотрел на спектакль. В нем говорится:
Класс List объявляет два оператора: operator == и operator!= и, таким образом, дает новое значение выражениям, которые применяют эти операторы к экземплярам List. В частности, операторы определяют равенство двух экземпляров List как сравнение каждого из содержащихся объектов с использованием их методов Equals. В следующем примере используется оператор == для сравнения двух экземпляров списка.
Честно... Я понятия не имею, о чем они говорят, но это не кажется правильным. Насколько я могу судить, после выполнения нескольких тестов класс List<T>
использует ссылочное равенство. Хороший вопрос.
EDIT2: декомпилированная перегрузка List<T>
, no operator==
и/или operator!=
. В этом случае спецификация оказывается совершенно неправильной.