C # generico con costante

C’è qualcosa di simile a questo modello C ++?

template  class B { int f() { return A; } } 

Voglio rendere ogni istanza di B , B , ecc. (Ad esempio tupla) di un tipo diverso.

La risposta breve è no .

Non si adatta al modo in cui i generici C #, come appunto ai modelli C ++, funzionano.

I generici .net non sono una funzione linguistica, sono una funzionalità di runtime. Il runtime sa come istanziare i generici da un generico bytecode generico che è piuttosto limitato rispetto a ciò che i modelli C ++ possono descrivere.

Confrontalo con i modelli C ++, che fondamentalmente istanziano l’intero AST della class usando tipi sostituiti. Sarebbe ansible aggiungere istanze basate su AST al runtime, ma sarebbe certamente molto più complesso dei generici attuali.

Senza caratteristiche come gli array di tipo valore (che esistono solo nel codice non sicuro), l’istanziazione della template ricorsiva o la specializzazione del modello usando tali parametri non sarebbe molto utile neanche.

C # non supporta parametri generici non di tipo come fa C ++.

I generici C # sono molto più semplici e meno capaci dei modelli C ++. MSDN ha un breve elenco di differenze tra i modelli C ++ e C # Generics .

Una soluzione a questa limitazione è definire una class che espone esso stesso il valore letterale a cui sei interessato. Ad esempio:

 public interface ILiteralInteger { int Literal { get; } } public class LiteralInt10 : ILiteralInteger { public int Literal { get { return 10; } } } public class MyTemplateClass< L > where L: ILiteralInteger, new( ) { private static ILiteralInteger MaxRows = new L( ); public void SomeFunc( ) { // use the literal value as required if( MaxRows.Literal ) ... } } 

Uso:

 var myObject = new MyTemplateClass< LiteralInt10 >( ); 

I generici C # sono specializzati in fase di esecuzione, mentre i modelli C ++ vengono elaborati in fase di compilazione per creare un tipo completamente nuovo. Detto questo, il runtime semplicemente non ha le caratteristiche per elaborare parametri non di tipo (non è solo un problema di C #).