as
no se puede usar con los tipos de valor (tipos no anulable).
Para los tipos de referencia ...
expression as type
es realmente lo mismo que
expression is type ? (type) expression : (type) null
excepto que expression
se evalúa sólo una vez.
En un guiño a Bill Clinton, por 'es' en 'expresión es tipo', quiero decir 'is'.
Básicamente, como indican las otras respuestas, eso significa que devuelve nulo cuando el lanzamiento fallará. Sin embargo, también devuelve nulo cuando el lanzamiento tendrá éxito pero el tipo es incorrecto.
Aquí es un ejemplo un tanto tonta:
uint? u = 52;
int? i = (int?) u; // 'i' is now 52
pero
uint? u = 52;
object d = u;
int? i = d as int?;
¿Cuál es el valor de i? 52? Nop. Es nulo
¿Por qué el objeto allí? Resulta que mentí arriba cuando expliqué 'como' en términos de 'es'.
Observe:
uint? u = 52;
int? i = (u is int?) ? (int?) u : (int?) null;
'i' es ahora null
uint? u = 52;
int? i = u as int?;
Vaya. Error del compilador Entonces, supongo que las dos declaraciones no son exactamente iguales después de todo.
En resumen: is is is y as is also is is. –
No solo eso, sino que tengo que escribir C# que usa '?' como Lisp usa paréntesis. :-) – Justin