2010-09-16 7 views

Respuesta

18

Usando as fallará con gracia si el objeto es el tipo equivocado, y el valor resultante será nula, en un molde normal sería lanzar una InvalidCastException:

object x = new object(); 
string y = x as string; // y == null 
string z = (string)x; // InvalidCastException 
1

as de fundición se nerer lanzar una excepción, mientras el elenco habitual puede.

Object a = new Object(); 
String b = a as String; 
if(b != null) // always false for this example. 
{} 
1

tipo normal yeso puede volver IllegalTypeCast excepción donde como as volverá null en ese caso.

1
((Class2) obj) // Throws exception when the casting cannot be made 

Class2 C = obj as Class2 // Will return NULL if the casting cannot be made 
0

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.

+2

En resumen: is is is y as is also is is. –

+0

No solo eso, sino que tengo que escribir C# que usa '?' como Lisp usa paréntesis. :-) – Justin

7

Los casos de uso de los dos operadores son superficialmente similares, pero semánticamente bastante diferentes. Un reparto comunica al lector "Estoy seguro de que esta conversión es legal y estoy dispuesto a tomar una excepción de tiempo de ejecución si me equivoco". El operador "como" comunica "No sé si esta conversión es legal o no, vamos a intentarlo y ver cómo funciona".

Para más información sobre este tema véase mi artículo sobre el tema:

http://blogs.msdn.com/b/ericlippert/archive/2009/10/08/what-s-the-difference-between-as-and-cast-operators.aspx

+1

Puede comunicar eso, pero no necesariamente. He usado la palabra clave 'as' cuando estoy seguro de que funcionará una conversión, porque prefiero ver:' (myobj como MyType) .SomeProperty' sobre '((MyType) myobj) .SomeProperty' En este caso, el La forma en que lo hice me comunica que estoy dispuesto a tomar 'NullReferenceException' en tiempo de ejecución si no lo hace. Solo quería señalar que es algo estilístico. – jasonh

+1

@jasonh - El uso de 'as' de esa manera me parece estilísticamente incorrecto. Haría que nos preguntemos por qué no se hizo un molde. Además, una excepción de conversión inválida llevaría a un desarrollador al problema más rápido que una excepción de referencia nula. Prefiero el estilo de Eric en esto. –

0

nunca obtendrá una excepción si la conversión usando "como" palabra clave. El resultado de la conversión será null si está intentando una conversión no válida.

La conversión implícita o explícita se puede usar entre clases/interfaces con heredar/implementar relaciones, de lo contrario dará un error de compilación. Ver ejemplo:

public class A {} 
public class B {} 
... 
A a = new A(); 
//B b = (B)a; //compile error:Cannot implicitly convert type 'A' to 'B' 

Otra situación de forma implícita/explícita convertir es que no hay relación entre la clase A y B, pero escribir un operador implicit/explicit mismo.

0

Además, como solo se puede usar con tipos de referencia. Esto es realmente bastante lógico, ya que si la conversión falla, devuelve falso, y ese no es un valor posible para un tipo de valor.

Por lo tanto, para los tipos de valor, se debe utilizar el encasillado normal.

Cuestiones relacionadas