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?

Était-ce utile?

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).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top