Durante la lettura di documentazione di Microsoft, mi sono imbattuto in un tale esempio di codice interessante:Perché esiste una restrizione per il casting esplicito di tipo generico a un tipo di classe ma non vi sono restrizioni per trasmettere un tipo generico a un tipo di interfaccia?
interface ISomeInterface
{...}
class SomeClass
{...}
class MyClass<T>
{
void SomeMethod(T t)
{
ISomeInterface obj1 = (ISomeInterface)t;//Compiles
SomeClass obj2 = (SomeClass)t; //Does not compile
}
}
Significa che è possibile lanciare la vostra generico per l'interfaccia in modo esplicito, ma non alla classe a meno che non si dispone di un vincolo. Bene, non riesco ancora a capire la logica alla base della decisione in quanto sia i casting di tipo di interfaccia che quelli di classe generano eccezioni, quindi perché si dovrebbe proteggere da una sola eccezione?
BTW c'è un modo per aggirare l'errore di compilazione, ma questo non elimina il disordine logica nella mia testa:
class MyOtherClass
{...}
class MyClass<T>
{
void SomeMethod(T t)
{
object temp = t;
MyOtherClass obj = (MyOtherClass)temp;
}
}
Per curiosità: puoi digitare "SomeClass obj2 = (SomeClass) (object) t;"? –
sì, questo viene eseguito dal secondo snippet –
Controlla questo http://philipm.at/2011/1014/, trovato quando si cerca di trovare la spiegazione. Spoiler alert - potrebbe confondervi di più !;) –