Почему в C# 7 ValueTuples реализован метод Equals, а не оператор двойного равенства?

Рассмотрим следующий фрагмент кода:

var tuple1 = (7, "foo");
var tuple2 = (7, "foo");
var tuple3 = (42, "bar");

Assert.That(tuple1.Equals(tuple2), Is.True);    //This passes
Assert.That(tuple1.Equals(tuple3), Is.False);   //This passes

Assert.That(tuple1 == tuple2, Is.True);         //This does not compile

Первые два утверждения проходят. Третий не компилируется.

Почему ValueTuple реализует пользовательский метод Equals, но не реализует оператор двойного равенства?

1 ответ

Решение

== оператор не реализован в библиотеке из-за противоречивых требований. Для всех x а также y что правильно реализовать object.Equals (даже если они оставят это в качестве сравнения), учитывая var tuple1 = (x, y); var tuple2 = (x, y);, tuple1.Equals(tuple2) является true, Но tuple1 == tuple2если реализовано, должно быть эквивалентно x == x && y == y, опять же, если реализовано. Последнее не всегда верно. В частности, это неверно, если x или же y является double.NaN, Это причина, по которой запрос на добавление добавляетoperator == в ValueTuple Было отказано.

Внедрение == в компиляторе, где это будет работать, только если элементы кортежа поддерживают сравнение через ==является открытым предложением для компилятора, но просто еще не реализовано. Не было большой активности, сейчас, похоже, нет причины, по которой она не будет реализована, но она просто не имеет высокого приоритета.

Другие вопросы по тегам