¿Por qué funciona el primero pero no el segundo? ¿Hay algo de qué preocuparse al convertir objetos en estructuras?
struct Hex { /* ... */ } object actionData = GetData();1:
bool isHex = actionData is Hex; Hex hexx = (Hex)actionData;2:
Hex hex = actionData as Hex;Porque as operador devuelve null si falla la verificación de tipo:
La expresión de la forma
E as TdondeEes una expresión que devuelve un valor yTes el nombre de un tipo o un parámetro de tipo, produce el mismo resultado que:E is T ? (T)(E) : (T)nullexcepto queEsolo se evalúa una vez.
Lo cual no se puede hacer si T es un tipo de valor no anulable (por lo que el compilador emite el error). Usar el tipo de valor anulable como T funcionará:
object actionData = new Hex(); // your code returning boxed Hex Hex? hex = actionData as Hex?; if(hex.HasValue) { ... }Caso 1
Suponiendo que el resultado de GetData() es del tipo correcto (es decir, algo que se puede convertir en la estructura Hex ), lo siguiente se compilará con éxito y también funcionará en tiempo de ejecución
struct Hex { ...} ... Hex foo = (Hex)GetData();porque siempre puede escribir una conversión explícita (es decir, le está diciendo al compilador que sabe lo que está haciendo y no debería preocuparse por las posibles incompatibilidades)
Caso 2
Si el resultado de GetData() es algo, eso no se puede convertir en Hex con el mismo código
struct Hex { ...} ... Hex foo = (Hex)GetData(); seguirá compilando con éxito (porque está anulando el compilador). Pero lanzará una InvalidCastException en tiempo de ejecución.
Caso 3
Su segundo fragmento ni siquiera se compilará. Porque el resultado del operador as es anulable (es decir as devuelve null si la verificación de tipo falla) y no puede asignar null a una estructura no anulable.
struct Hex { ...} ... Hex hex = actionData as Hex;Si desea poder compilar esto, debe hacer que la variable sea anulable como
Hex? hex = actionData as Hex?; if (hex.HasValue) { ... //conversion succeeded } else { ... //conversion failed and hex is null } o haces de Hex una class en lugar de una struct . Porque una class es un tipo de referencia que también puede ser null , pero una struct es un tipo de valor que no puede ser nulo.