Проверка составного нуля с ненулевым параметром

Я просматривал некоторые справочные материалы по MS для предстоящего экзамена и нашел предположительно предыдущий вопрос, в котором я не согласен с ответом.

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

введите описание изображения здесь

У меня проблема в том, что они дают ответ как B, тогда как я думаю, что это должен быть A по следующим причинам.

Предложение where в запросе LINQ имеет два критерия, по которым оно должно сравниваться с тем, где годы совпадают в DateTime? объект и параметр метода.

Тем не менее, меня больше интересует, почему они считают, что проверка на ноль необходима из-за того, что тип параметра является ненулевым int. Отмена назначения и попытка присвоить значение NULL до передачи параметра по значению приведет к ошибке компилятора.

Если годовой параметр никогда не может быть нулевым, никогда не будет нулевого совпадения DateTime, что делает проверку нуля лишней.

Я понимаю, почему B также дает ожидаемые результаты, но что-то не так с ответом A.

(Ps, я читал - сравнивая ненулевые `int` с` null` (LINQ), которые, кажется, подтверждают мою теорию, я просто брезглив о несогласии с справочным материалом)

Всего 2 ответа


Предположим, вы выбрали A, если Дата равна нулю, вы получите следующее Исключение

Nullable object must have a value.
  + System.ThrowHelper.ThrowInvalidOperationException(System.ExceptionResource)
  + Nullable<T>.get_Value()

например

DateTime? dt = null;
 if (dt.Value.Year == 2010) Console.WriteLine("Accepted Value");

Дай ошибку


Заявка должна соответствовать следующим требованиям:

  • Возврат только тех заказов, которые имеют значение OrderDate, отличное от нуля.
  • Возврат только тех заказов, которые были размещены в году, указанном в параметре year

Кроме того, строка 1, кажется, показывает вам определение OrderDate

public DateTime? OrderDate;

Вопрос говорит вам, что OrderDate является обнуляемым объектом DateTime , и что вам нужно проверить, что он имеет значение.

Изменить: я попробовал это для себя, используя SQLEXPRESS и LINQPad 5, и теперь я вижу, что ответ А работает в контексте LINQ to SQL, потому что он преобразуется в

WHERE DATEPART(Year,OrderDate) = @year

И это отфильтрует нулевые OrderDates.

Все, что я могу сказать, это то, почему я считаю, что ответ B - это «предпочтительный» ответ.

Ответ A во всех других контекстах C # вызовет исключение InvalidOperationException «объект Nullable должен иметь значение», и это просто работает в этом контексте, потому что это LINQ to SQL.

Ответ B будет работать как в контексте C #, так и в контексте LINQ to SQL, поэтому из двух возможных ответов он является наиболее безопасным и поможет вам избежать использования ответа типа A в контексте, в котором он потерпит неудачу. Кроме того, я считаю, что более четко и недвусмысленно сообщается, что вы хотите отфильтровать нулевые даты заказа. При дополнительной проверке нулевого значения может произойти незначительное снижение производительности, но, если не будет проблемы с измеримой производительностью, удобочитаемость важнее, чем незначительные улучшения производительности. Если бы я использовал ответ A, я бы включил множество комментариев, описывающих поведение LINQ to SQL, объясняющих, почему проверка нулями не нужна.


Есть идеи?

10000