Durante la lectura de la documentación de Microsoft, me encontré con un ejemplo de código tan interesante:¿Por qué hay una restricción para convertir explícitamente un genérico a un tipo de clase pero no hay restricciones para convertir un genérico a un tipo de interfaz?
interface ISomeInterface
{...}
class SomeClass
{...}
class MyClass<T>
{
void SomeMethod(T t)
{
ISomeInterface obj1 = (ISomeInterface)t;//Compiles
SomeClass obj2 = (SomeClass)t; //Does not compile
}
}
Esto significa que puede emitir su genérico para la interfaz explícita, pero no a la clase a menos que tenga una restricción. Bueno, todavía no puedo entender la lógica detrás de la decisión, ya que tanto la interfaz como el tipo de clase emiten excepciones, entonces, ¿por qué uno debería protegerse contra solo una de estas excepciones?
Por cierto, no es una forma de evitar el error de compilación, pero esto no elimina el desorden lógica en mi cabeza:
class MyOtherClass
{...}
class MyClass<T>
{
void SomeMethod(T t)
{
object temp = t;
MyOtherClass obj = (MyOtherClass)temp;
}
}
Por curiosidad: ¿puede escribir "SomeClass obj2 = (SomeClass) (object) t;"? –
sí, esto se hace mediante el segundo fragmento –
Compruebe este http://philipm.at/2011/1014/, lo encontró al intentar encontrar la explicación. Alerta de spoiler: ¡podría confundirte más !;) –