Downcasting un tipo generico in C# 3.5
Domanda
Perché posso solo girare un generico e non abbattere?
Come non è chiaro al compilatore che se il mio vincolo dice where T : BaseClass
e u è derivato da Baseclass che (U)objectOfTypeT
è valido?
Soluzione
Perché potrebbe non essere valido. Considera questo:
class Base { }
class A : Base { }
class B : Base { }
A temp1 = new A();
B temp2 = (B)temp1; // not valid
Solo perché condividono la stessa classe di base non significa che puoi digitare l'una all'altra.
Nota che puoi aggirare questo usando il as
operatore:
var result = objectOfTypeT as U; // this does not give any compilation error
// but will result in a null reference if
// objectOfTypeT cannot be converted to U
Altri suggerimenti
A meno che non legga la domanda sbagliata, potresti avere:
class A:BaseClass{}
class B:BaseClass{}
Con T = A e U = B, entrambi i vincoli sono felici, ma il cast da T a U è chiaramente non valido.
Se sei solo un'altra classe, allora lo stesso vale ancora; La T non è nota per essere nella stessa catena di U a meno che non lo dichiari nei vincoli (i vincoli generici possono coinvolgere altri argomenti di tipo generico, se aiuta).