Итак, сегодня я столкнулся с ситуацией, когда некоторый производственный код дал сбой именно потому, что метод выполнялся точно так же, как , документированный в MSDN . Позор мне, что я не читал документацию. Тем не менее, я до сих пор ломаю голову над , почему ведет себя так, даже если «нарочно», так как это поведение в точности противоположно тому, что я ожидал (и другие известные способы поведения), и поэтому похоже, нарушает принцип наименьшего удивления.
Метод All()
позволяет предоставить предикат (например, лямбда-выражение) для проверки IQueryable
, возвращая логическое значение, которое указывает, соответствуют ли все члены коллекции тесту. Все идет нормально. Вот где это становится странным. All()
также возвращает true
, если коллекция пуста. Это кажется мне совершенно отсталым по следующим причинам:
- Если коллекция пуста, такой тест в лучшем случае не определен. Если моя дорога пуста, я не могу утверждать, что все машины, припаркованные там, красные. При таком поведении на пустой подъездной дороге все припаркованные автомобили обозначены красным И синим И шахматной доской - все эти выражения вернут истину.
- Для тех, кто знаком с понятием SQL, что NULL! = NULL, это неожиданное поведение.
- Метод
Any()
ведет себя так, как ожидается, и (правильно) возвращает значение false, поскольку в нем нет элементов, соответствующих предикату.
Итак, мой вопрос: почему All()
ведет себя так? Какую проблему это решает? Это нарушает принцип наименьшего удивления?
Я пометил этот вопрос как .NET 3.5, хотя поведение также относится и к .NET 4.0.
РЕДАКТИРОВАТЬ Хорошо, поэтому я понимаю логический аспект этого, как это отлично изложено Джейсоном и остальными вами. По общему признанию, пустая коллекция является чем-то вроде крайнего случая. Я предполагаю, что мой вопрос коренится в борьбе, которая, просто потому что что-то является логичным , не означает, что это обязательно имеет смысл , если вы не в правильном настроении.