Подтвердить что ты не робот

Список операторов <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"
4b9b3361

Ответ 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!=. В этом случае спецификация оказывается совершенно неправильной.