Le type 'T' ne peut pas être utilisé comme paramètre de type dans le générique du type ou de la méthode d'erreur quand le type est connu
Considérer l'exemple de code suivant, où Concrete
dérive de Base
:
class Base{}
class Concrete : Base {}
static void Foo<T>() where T : Base
{
if (typeof(Concrete).IsAssignableFrom(typeof(T)))
{
var x = new Bar<T>(); //compile error on this line
}
}
class Bar<T> where T : Concrete
{
}
Sur la ligne où je vais avoir le message d'erreur de compilation, j'ai déjà vérifié que l'argument générique est assignable à la Concrete
type. Donc, en théorie, je crois qu'il devrait être un moyen de créer une instance de la Barre de classe.
Est-il possible que je peux enlever l'erreur de compilation? Je ne peux pas penser à une façon de jeter de l'argument.
Texte intégral de l'erreur de compilation:
Erreur 14 type 'T' ne peut pas être utilisé comme paramètre de type 'T' dans le
de type générique ou d'une méthode
'Bar'. Il y
est pas une référence implicite conversion de 'T' à
"Concret".
Votre code ne correspond pas au message d'erreur. Sûrement que vous avez écrit
Bar<T>();
Est-il une raison que Toto n'a pas
where T : Concrete
?lors de l'édition, vous pouvez également préciser la relation entre
Base
et Concrete
merci; edit: il n'y a aucun moyen de le faire. Vous pouvez pirater avec de la réflexion (
MakeGenericMethod
etc), mais ce n'est pas un bon réponse. Si vous pouvez supprimer la contrainte de Bar<T>
et faire un peu de coulée (via object
) à l'intérieur de Bar<T>
, que peut-travail.OriginalL'auteur Zaid Masud | 2012-11-06
Vous devez vous connecter pour publier un commentaire.
Le compilateur n'a aucun moyen de savoir que T, qui est actuellement contrainte à la Base est fait de Béton, et que même si vous le tester avant.
Donc:
Ne laissez pas la chance de le faire.
OriginalL'auteur LightStriker