Nullable <T>: а перегруженные операторы, бул? & bool - PullRequest
6 голосов
/ 19 ноября 2008
  1. Почему оператор '&' определен для bool?
  2. Как именно это 1) bool? & bool? и 2) bool? а bool работает?

Любая другая "интересная" семантика операторов в Nullable? Какие-нибудь перегруженные операторы для универсального T?

Ответы [ 4 ]

13 голосов
/ 19 ноября 2008

Операторы на 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() имеет побочные эффекты, так как при сохранении в базу данных ...

4 голосов
/ 19 ноября 2008

Операторы короткого замыкания (&& ||) не определены для bool?

Только логические операторы И, включая ИЛИ, и они ведут себя так:

x        y      x & y   x | y   
true    true    true    true
true    false   false   true
true    null    null    true
false   true    false   true
false   false   false   false
false   null    false   null
null    true    null    true
null    false   false   null
null    null    null    null
1 голос
/ 19 ноября 2008

Оператор "&" является побитовым оператором, а "&&" является логическим оператором. Логический оператор «И» не может быть применен к значению threestate, только для двух состояний.

0 голосов
/ 19 ноября 2008

- Кроме того, логический оператор && вместе с || оператор не может быть перегружен.

2) Причина, по которой работает побитовый оператор, заключается в том, что он работает с одиночными битами, которые являются простыми 1 или 0. Это то, чем по сути являются логические операторы: истина и ложь, 1 и 0.

...