Почему List <T>.Sort (IComparer <T>) и List <T>.Sort (сравнение <T>) по-разному обрабатывают угловые случаи? - PullRequest
1 голос
/ 02 ноября 2019

1, Sort(IComparer<T>) будет пытаться использовать Comparer<T>.Default, когда его параметр равен нулю.
Sort(Comparison<T>) будет выдавать ArgumentNullException.
Есть ли причина против использования Comparer<T>.Default.Compare, когдапараметр сравнения имеет значение null?

2, Sort(IComparer<T>) не вызовет исключения для списков, содержащих менее двух элементов, даже если T не равно IComparable.
С другой стороны, Sort(Comparison<T>) всегдаВыдает ArgumentNullException, когда параметр имеет значение NULL.
Разве этот метод не допускает такой же разболтанности?

1 Ответ

0 голосов
/ 02 ноября 2019

Почему List.Sort (IComparer) и List.Sort (сравнение) обрабатывают угловые случаи по-разному?

Поскольку программисты этих функций решили так. После того, как было решено, поведение больше не может быть изменено без нарушения существующего кода. Единственный способ изменить это - отказаться от всего класса, чтобы создать новый. И эти мелкие проблемы не стоили ничего подобного.

Если только они или кто-то из этого возраста случайно не оказались поблизости, угадать их причины было бы просто - угадывание.

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

При этом, по предположению / профессиональному мнению:

Есть ли основания против попытокиспользовать Comparer.Default.Compare, когда параметр сравнения имеет значение null?

Есть ли какая-либо причина для выдачи ошибки / ошибки компилятора Invalid Cast, а не для неявного приведения? Да, потому что неявные операции вызывали всевозможные проблемы в 60-летнюю историю программирования. Быть агрессивным с «исправлениями» - именно то, что вызвало примеры PHP и Javascript в этом комиксе . Подсказка: JS делает неправильные вещи в обоих случаях. Случается, что случайно получается правильный результат.

Ничто не глупо, как код, который пытается быть умным. Попытка исправить входную переменную самостоятельно - особенно нулевое значение - это случай, когда нужно быть умным. Если бы они хотели компаратор по умолчанию, они могли бы просто использовать Sort () без параметров. И проверка значения на ноль перед передачей его функции в качестве аргумента тривиальна.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...