2011-12-31 12 views
7

Si consideri il seguente codice:Come vincolare un generico per essere di tipo enum?

class Base<T> 
{ 
//Base members 
} 

voglio il generico T di essere un enum (utilizzando i vincoli se possibile). Come posso farlo in C#?

EDIT:
utilizzo di contratti di codice -introduced da Akash Kava- sembra anche un bel modo. Sono riuscito a farlo produrre un errore di run-time che è inutile. Here è il codice che ho provato. Dovrebbe essere possibile generare un avviso di tempo di compilazione ma non riesco a farlo funzionare.

+1

Questo è un duplicato, giusto? – BoltClock

+3

Link per duplicare per favore? – atoMerz

+0

Molti di questi, ma uno di quelli canonici che posso trovare è http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum, che sebbene riguardi un metodo generico non una classe generica, i vincoli di tipo funzionano esattamente allo stesso modo. – BoltClock

risposta

12

Questo è supportato a livello IL ma non in C#. Puoi dare un'occhiata a unconstrained melody scritto da Jon Skeet che ti permette di farlo. Ed ecco il corrispondente blog post dove spiega in dettaglio.

+1

Sorpreso che non c'è modo in C#. :( – atoMerz

+0

Per curiosità, l'IL consente a un generico enum-constrained di fare qualsiasi cosa che un generico non vincolato può fare se non richiamare il lento 'Enum.HasFlag'? La mia ipotesi sarebbe che la C# crew ha giudicato il livello del supporto di IL essere insufficiente per ciò che la gente vorrebbe fare con i generici enum-constrained, e pensò (erroneamente IMHO) che sarebbe stato meglio non permetterli di permetterli, ma non averli in grado di fare molto .. – supercat

+0

C'è [ExtraConstraints.Fody] (https://github.com/Fody/ExtraConstraints) per ottenere tutta la tessitura di IL in un modo molto semplice. Basta installare i pacchetti di nuget 'Fody' e' ExtraConstraints.Fody' e aggiungere i vincoli al codice come mostrato su il repository Forse dovresti aggiungere questo alla risposta? – BatteryBackupUnit

Problemi correlati