Что такое снятые операторы?

Я просматривал эту статью и изо всех сил стараюсь следовать примеру VB.NET, который объясняет отмененные операторы. Кажется, что нет эквивалентного примера С# или учебника. У меня нет большого опыта работы с перегрузкой операторов в целом, поэтому попытка примириться с эквивалентом VB.NET при чтении обнуляемых типов, вероятно, не лучшее место для начала...

Кто-нибудь сможет дать объяснение отмененным операторам и тому, как они используются в обнуляемых типах? Означает ли это, что обнуляемый тип сам по себе не перегружает операторы и будет использовать операторы базового типа, который он представляет?

Похоже, на SO мало информации о поднятых операторах, так что, надеюсь, это может помочь и другим.

Ответ 1

Поднятые операторы - это операторы, которые работают над нулевыми типами, "поднимая" операторы, которые уже существуют в непустой форме. Так, например, если вы это сделаете:

int? x = 10;
int? y = 10;
int? z = x + y;

Оператор "+" снят. На самом деле он не существует на Nullable<int>, но компилятор С# действует так, как если бы он это делал, создавая код для правильной работы. (В большинстве случаев вопрос о том, является ли любой из операндов нулевым, если это так, результат равен нулю. В противном случае разворачивайте оба операнда до значений, не имеющих значения NULL, используйте обычный оператор, а затем заверните результат обратно в нулевое значение. Однако есть несколько особых случаев вокруг сравнений.)

Для получения дополнительной информации см. раздел 6.4.2 (снятые операторы преобразования) и 7.3.7 (снятые операторы) С# spec.

Ответ 2

Поднятые операторы позволяют использовать предопределенные и определяемые пользователем операторы, которые работают с необнуляемыми типами, для их обнуляемых форм.

int i = 5;
int? j = 6;

int? k = j + i;    // 11
int? q = i + null; // null - Shows a warning the result of the expression is always null of type int?
int r = i + null; // Throws an error the result of expression is always null of type int?