2012-11-06 3 views
5

Prenons l'exemple de code suivant, où Concrete dérive de Base:Le type « T » ne peut pas être utilisé comme paramètre de type dans le type générique ou d'une erreur de méthode lorsque le type est connu

Sur la ligne où je suis ayant l'erreur de compilation, j'ai déjà vérifié que l'argument générique est assignable au type Concrete. Donc, en théorie, je crois qu'il devrait y avoir un moyen de créer une instance de la classe Bar.

Est-il possible de supprimer l'erreur de compilation? Je ne peux pas penser à un moyen de jeter l'argument.


Texte intégral de l'erreur de compilation:

Error 14 The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Bar'. There is no implicit reference conversion from 'T' to 'Concrete'.

+1

Qui compile pour moi ... est-ce l'exemple * réel *? y a-t-il peut-être des paramètres dans votre vrai code? –

+1

Votre code ne correspond pas au message d'erreur. Vous avez sûrement écrit 'Bar ();' –

+0

Y at-il une raison pour laquelle Foo n'a pas 'where T: Concrete'? – Servy

Répondre

4

Le compilateur n'a aucun moyen de savoir que T, qui est actuellement contrainte de base est en fait de béton, et que même si vous testez avant.

Alors:

Type type = typeof(Bar<>); 
Type generic = type.MakeGenericType(typeof(T)); 
var x = Activator.CreateInstance(generic); 

Ne laissez pas la chance de le faire.

Questions connexes