Downcasting un type générique en C # 3.5
Question
Pourquoi ne puis-je upcast un générique et non downcaster il?
Comment est-il pas clair au compilateur que si ma contrainte dit where T : BaseClass
et U est dérivé de BaseClass que (U)objectOfTypeT
est valide?
La solution
Parce qu'il pourrait ne pas être valide. Considérez ceci:
class Base { }
class A : Base { }
class B : Base { }
A temp1 = new A();
B temp2 = (B)temp1; // not valid
Juste parce qu'ils partagent la même classe de base ne signifie pas que vous pouvez typer un à l'autre.
Notez que vous pouvez contourner ce problème en utilisant l'opérateur as
:
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
Autres conseils
À moins que je lis la mauvaise question, vous pourriez avoir:
class A:BaseClass{}
class B:BaseClass{}
Avec T = A et U = B, les deux contraintes sont heureux, mais la distribution de T à U est clairement non valide.
Si U est juste une autre classe, le même encore; T est pas connu pour être dans la même chaîne que U à moins que vous ne déclarez dans les contraintes (contraintes génériques peuvent impliquer d'autres arguments de type générique, si elle aide).