Операторы на Nullable<T>
являются "поднятыми" операторами. Что это значит: если T имеет оператор, T? будет иметь «поднятый» аналог.
&& и || на самом деле не являются операторами в том же смысле, что и & и | - например, они не могут быть перегружены - из спецификации ECMA 14.2.2 Перегрузка оператора:
Перегружаемые бинарные операторы:
+ - * /% & | ^ << >> ==! => <> = <= Только операторы, перечисленные выше, могут быть
перегружен. В частности, это не
возможна перегрузка доступа члена,
вызов метода или =, &&, ||,
??,?:, проверено, не проверено, новое,
typeof, as и is операторы. </p>
Аналогично, из спецификации ECMA, 14.2.7 Поднятые операторы, поднятые операторы:
для унарных операторов
+ ++ - -! ~
Для бинарных операторов
+ - * /% & | ^ << >>
Для операторов равенства
==! =
Для реляционных операторов <> <=> =
Таким образом, в основном операторы короткого замыкания не определены как поднятые операторы.
[редактировать: добавлен лист шпаргалки]
Поднятый оператор: оператор, предоставленный компилятором на Nullable<T>
, на основе операторов T - например: int
"+" оператор получает "поднятый" на int?
, определяемый как:
(int? X, int? Y) => (x.HasValue && y.HasValue)? (x.Value + y.Value): (int?) null;
Перегрузка оператора: акт предоставления пользовательской реализации оператора для данного типа; например decimal
и DateTime
обеспечивают различные перегрузки оператора
Короткое замыкание: нормальное поведение &&
и ||
(во многих языках, включая C ++ и C #) - то есть второй операнд может не оцениваться - то есть
(expression1, expression2) => expression1 ()? expression2 (): false;
Или, возможно, более простой пример:
bool someFlag = Method1() && Method2();
, если Method1()
возвращает false, то Method2()
не выполняется (поскольку компилятор уже знает, что общий ответ равен false). Это важно, если Method2()
имеет побочные эффекты, так как при сохранении в базу данных ...