Добавлено как ответ, потому что это слишком долго, чтобы быть комментарием.
Если вам нужно засорять вашу кодовую базу Nullable.Compare
, вы делаете это неправильно. Вам не следует сравнивать два Nullable<int>
значения, если вы уже не знаете, что оба они не равны нулю.
Единственное исключение - в местах, где это совершенно неизбежно, например при агрегировании или сортировке. Если вы используете стандартные методы (например, Linq) для этого, вам не нужно реализовывать что-то особенное для этого, потому что Nullable<T>
реализует IComparable<T>
.
Существует причина, по которой в SQL Server любое выражение, содержащее термин NULL, оценивается как NULL. Если одним из терминов в выражении является NULL, результат выражения будет бессмысленным - если выражение явно не указывает (через ISNULL или COALESCE), что делать, если термин является NULL. Это решение должно приниматься в выражении или вокруг него, а не глобально.
Например, рассмотрим эту, казалось бы, простую логику:
if (qtyOrdered > qtyInStock)
{
Reorder(qtyInStock - qtyOrdered);
}
Это вызовет исключение, если qtyInStock
равно нулю. Что должен эта логика делать, если qtyInStock
равен нулю? Мы не знаем: это вопрос, который необходимо учитывать при разработке бизнес-логики, и он еще не решен.
Но есть одна вещь, которую мы почти наверняка делаем знаем: если qtyInStock
равно нулю, генерирование нового заказа для Int.MinValue - qtyOrdered
предметов является неправильным ответом. И это то, что логика, как это будет делать, если вы используете магическое число для обозначения нулей. Логика нарушена, и она должна быть исправлена, а не скрыта.