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

Qui compile pour moi... c'est que le exemple? y sont peut-être des paramètres dans le code réel?
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