Почему я могу проверить DateTime на нулевое значение, даже если это тип значения? - PullRequest
4 голосов
/ 12 мая 2011

Компилируется без ошибок или предупреждений, как это возможно?

if (DateTime.Now == null) { }

EDIT:

Становится еще лучше:

Если я делаю то же самое с Decimal, int или пользователем, определенным struct, я получаю ошибку компилятора.

В чем разница?

Ответы [ 3 ]

2 голосов
/ 12 мая 2011

Почему TimeSpan и структуры Guid сравниваются с нулем?

Хорошее объяснение в ответе здесь

Некоторые инструменты анализа кода (например, Resharper) помечают его как «всегда ложный», а последующий код - как недостижимый.

2 голосов
/ 12 мая 2011

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

Что касается того, почему это разрешено, ВСЕ типы в .NET (включая те, которые наследуются более напрямую от System.ValueType) наследуются от System.Object, который определяет оператор ==.Это означает, что каждый тип может быть сравнен для ссылочного равенства.Однако ValueTypes никогда не будет иметь нулевое значение, потому что CLR всегда гарантирует на очень глубоких уровнях, что «ссылки» ValueType всегда имеют значение, даже если они помещены в штучную упаковку как ссылочные типы.

2 голосов
/ 12 мая 2011

Если вы поместили код в блок, он использовал для предупреждения о недоступном коде, но IIRC это предупреждение исчезло (о проблеме сообщалось).

Что касается "почему";потому что существует законное неявное преобразование (box или nullable), которое позволяет тесту работать в соответствии с требованиями языка.Тем не менее, он всегда будет false, и компилятор IIRC достаточно умен, чтобы вырезать явно недоступный код (позор о предупреждении).

...