mark - operator c#
¿Por qué se puede utilizar el operador as con Nullable<T>? (6)
Según la documentación del operador as
, as
"se utiliza para realizar ciertos tipos de conversiones entre tipos de referencia compatibles". Como Nullable es en realidad un tipo de valor , esperaría as
no funcionara con él. Sin embargo, este código compila y ejecuta:
object o = 7;
int i = o as int? ?? -1;
Console.WriteLine(i); // output: 7
¿Es este el comportamiento correcto? ¿La documentación está as
mal? ¿Me estoy perdiendo de algo?
¿Es este el comportamiento correcto?
Sí.
¿La documentación está tan mal?
Sí. He informado al gestor de documentación. Gracias por llamar mi atención y disculpas por el error. Obviamente, nadie se acordó de actualizar esta página cuando se agregaron tipos anulables al lenguaje en C # 2.0.
¿Me estoy perdiendo de algo?
Podría considerar leer la especificación real de C # en lugar de la documentación de MSDN; Es más definitivo.
Al parecer, la documentación de MSDN sobre el operador as debe actualizarse.
object o = 7;
int i = o as **int** ?? -1;
Console.WriteLine(i);
Si prueba el siguiente código en el que usamos el operador as con el tipo de valor int, obtendrá el mensaje de error apropiado del compilador que
El operador as se debe usar con un tipo de referencia o un tipo de nullable (''int'' es un tipo de valor no anulable)
Hay una actualización aunque en el enlace en la sección Contenido de la Comunidad que cita:
The as operator must be used with a reference type or nullable type.
De la documentación sobre la palabra clave as :
Es equivalente a la siguiente expresión, excepto que la expresión se evalúa solo una vez.
expresión es tipo? Expresión (tipo): (tipo) nulo
La referencia para su uso también indica que funciona con tipos de referencia, sin embargo, también puedes hacer cosas como esta:
int? temp = null;
if (temp is int?)
{
// Do something
}
Supongo que es solo una imprecisión en la documentación de referencia en que el tipo debe ser anulable (es decir, un tipo anulable o un tipo de referencia) en lugar de solo un tipo de referencia.
Estás aplicando el ''como'' al objeto, que es un tipo de referencia. Podría ser nulo, en cuyo caso el CLR tiene un soporte especial para desempaquetar la referencia ''null'' a un tipo de valor anulable. Este unboxing especial no es compatible con ningún otro tipo de valor, por lo que, aunque Nullable sea un tipo de valor, tiene ciertos privilegios especiales.
Solo una conjetura, pero yo diría que las cajas o como un entero y luego las convierte en un nullable.
Yo leo:
Tenga en cuenta que el operador as solo realiza conversiones de referencia y conversiones de boxeo. El operador as no puede realizar otras conversiones, como las conversiones definidas por el usuario, que deberían realizarse utilizando expresiones de conversión.
Y las conversiones de boxeo .....