2011-08-18 9 views
19

De acuerdo con la documentación del as operator, as "se utiliza para realizar ciertos tipos de conversiones entre tipos de referencia compatibles". Desde Nullable is actually a value type, esperaría que as no funcione con él. Sin embargo, este código se compila y ejecuta:¿Por qué se puede usar el operador as con Nullable <T>?

object o = 7; 
int i = o as int? ?? -1; 
Console.WriteLine(i); // output: 7 

¿Este comportamiento es correcto? ¿La documentación de as es incorrecta? ¿Me estoy perdiendo de algo?

+3

Anulable es un tipo de valor, he corregido el texto. –

+0

@Matthew: Gracias. Eso fue un error bastante confuso. – recursive

+1

Gran discusión sobre AS/IS y Nullables - http://stackoverflow.com/questions/1583050/performance-surprise-with-as-and-nullable-types – sll

Respuesta

21

¿Este comportamiento es correcto?

Sí.

¿La documentación es incorrecta?

Sí. Le informé al gerente de documentación. Gracias por traer esto a mi atención y disculpas por el error. Obviamente, nadie recordó actualizar esta página cuando se agregaron tipos anulables al lenguaje en C# 2.0.

¿E-cando algo?

Puede considerar leer la especificación C# real en lugar de la documentación de MSDN; es más definitivo

2

leí:

Tenga en cuenta que el operador as sólo realiza las conversiones de referencia y las conversiones de boxeo. El operador as no puede realizar otras conversiones, como las conversiones definidas por el usuario, que en su lugar deberían realizarse mediante el uso de expresiones de conversión.

y conversiones de boxeo .....

+0

Pero no es solo un simple boxeo, ya que era simplemente un ' int' que estaba encuadrado, y un 'int?' que es el objetivo del 'as'. – recursive

+0

¿Por qué piensas int? tiene que ser administrado de diferente manera desde la perspectiva de este problema? – Tigran

+0

No sé por qué es diferente. En cierto sentido, eso está relacionado con lo que estoy preguntando. – recursive

1

sólo una suposición, pero yo diría que las cajas o como un entero y luego la convierte en una anulable.

+1

Casi. * Desempaqueta * el objeto como un entero si es un número entero, y luego lo convierte en un valor nulo. Si el unboxing falla, el resultado es, por supuesto, un nulo nulo nulo. –

0

Está aplicando el 'como' a Object, que es un tipo de referencia. Podría ser nulo, en cuyo caso el CLR tiene soporte especial para desempaquetar la referencia 'nulo' a un tipo de valor que admite nulos. Este unboxing especial no es compatible con ningún otro tipo de valor, por lo tanto, aunque Nullable es un tipo de valor, tiene ciertos privilegios especiales.

1

De la documentación acerca de la como palabra clave:

Es equivalente a la siguiente expresión, excepto que la expresión se evalúa sólo una vez.

expresión es tipo? (Tipo) expresión: (tipo) null

La referencia para es uso también afirma que trabaja con los tipos de referencia, sin embargo, también puede hacer cosas como esta:

int? temp = null; 
if (temp is int?) 
{ 
    // Do something 
} 

estoy Supongo que es solo una imprecisión en la documentación de referencia en el sentido de que el tipo debe ser nullable (es decir, un tipo anulable o un tipo de referencia) en lugar de solo un tipo de referencia.

1

Aparentemente, se debe actualizar la documentación de MSDN en el as operator.

object o = 7; 
int i = o as **int** ?? -1; 
Console.WriteLine(i); 

Si intenta el siguiente código donde utilizamos el operador as con el int tipo de valor, se obtiene el mensaje de error del compilador apropiado que

el operador as debe ser utilizado con un tipo de referencia o tipo anulable ('int' es un tipo de valor no anulable)

Hay una actualización aunque en the link en la sección contenido de la comunidad que se cita:

The as operator must be used with a reference type or nullable type. 
Cuestiones relacionadas