2010-07-30 20 views
49

Estaba mirando this article y estoy luchando para seguir el ejemplo de VB.NET que explica los operadores levantados. No parece haber un ejemplo o tutorial equivalente de C#. No tengo mucha experiencia con la sobrecarga del operador en general, por lo que intentar llegar a un acuerdo con el equivalente de VB.NET mientras leía sobre tipos anulables probablemente no sea el mejor lugar para comenzar ...¿Qué son los operadores levantados?

¿Alguien estaría ¿Puede proporcionar una explicación de los operadores levantados y cómo los usan los tipos anulables? ¿Simplemente significa que el tipo anulable no sobrecarga a los operadores y usará los operadores del tipo subyacente que representa?

No parece haber mucha información sobre SO sobre operadores levantados, así que con suerte esto también puede ayudar a otros.

Gracias

+0

Ah .. Pensé que (nulo >> 1) no era válido y me preguntaba ¿por qué es el caso? parece operar en x en la segunda instrucción de (int? x = null; (x >> 1) ?? -1;). Pensaba que ?? "lo transforma" a una forma válida ((x == nulo)? -1: (x >> 1);). Resulta que estaba operando en (x >> 1) en su lugar, y que (null >> 1) es válido. – blizpasta

Respuesta

92

operadores levantados son operadores que trabajan sobre tipos anulables por "lifting" los operadores que ya existen en la forma no anulable. Por ejemplo, si lo hace:

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

Ese operador "+" se levanta. En realidad no existe en Nullable<int> pero el compilador C# actúa como si lo hiciera, generando código para hacer lo correcto. (En la mayoría de los casos, se trata de verificar si alguno de los operandos es nulo; si es así, el resultado es nulo. De lo contrario, desenvuelva ambos operandos en sus valores no admitibles, use el operador normal y luego envuelva el resultado en un valor nulos. Sin embargo, existen algunos casos especiales en torno a las comparaciones)

Consulte la sección 6.4.2 (operadores de conversión levantados) y 7.3.7 (operadores levantados) del C# spec para obtener más información.

+3

Esta respuesta no dice nada sobre lo que "es lo correcto" en realidad, lo que creo que es el aspecto más importante de cómo funcionan los operadores mejorados. – Ani

+0

@JonSkeet: Su enlace dirige a la especificación C# 5; ¿Quisiste decir 5 aquí o vincular a las 4 especificaciones? –

+0

@ Cᴏʀʏ: Era la especificación C# 4 cuando me uní a ella, pero ese enlace ahora va a la especificación C# 5 ... podría ser la especificación C# 6 en unos pocos meses :) –

Cuestiones relacionadas