2012-11-06 24 views
5

Si consideri il seguente esempio di codice, dove Concrete deriva da Base:Il tipo 'T' non può essere utilizzato come parametro di tipo nel tipo generico o errore di metodo quando tipo è noto

Nella riga in cui sono avendo l'errore di compilazione, ho già controllato che l'argomento generico sia assegnabile al tipo Concrete. Quindi, in teoria, credo che ci dovrebbe essere un modo per creare un'istanza della classe Bar.

C'è un modo per rimuovere l'errore di compilazione? Non riesco a pensare a un modo per gettare la discussione.


testo completo di errore di compilazione:

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

Che mi compila ... è l'esempio * effettivo *? ci sono forse dei parametri nel tuo codice reale? –

+1

Il tuo codice non corrisponde al messaggio di errore. Sicuramente hai scritto 'Bar ();' –

+0

C'è una ragione per cui Foo non ha 'where T: Concrete'? – Servy

risposta

4

Il compilatore non ha modo di sapere che T, che è attualmente vincolo per Base è in realtà in cemento armato, e che, anche se si prova prima.

Quindi:

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

Non lasciate che la possibilità di farlo.