2009-09-26 15 views

risposta

2

Il `1 è la sintassi MSIL per un tipo generico - List<T> è specifico C#. Altri esempi: MSIL

List<T> == System.Collections.Generic.List`1 
List<string> == System.Collections.Generic.List`1[System.String] 
Dictionary<string, int> == 
    System.Collections.Generic.Dictionary`2[System.String, System.Int32] 
+0

Penso che ti sia mancato il punto. \ '1 non definisce una classe generica per il CLR. A livello IL, una classe generica può essere chiamata arbitrariamente. È un metodo per risolvere le ambiguità tra tipi generici sovraccaricati per linguaggi di livello superiore. Dichiara il numero di parametri di tipo per il tipo in modo che sia possibile sovraccaricare i tipi in base al numero di parametri generici. Il tuo esempio è sbagliato 'Dizionario ' è Dizionario \ '2 [System.String, System.Int32], non Dizionario \' 1, poiché ha ** due ** parametri di tipo. –

+0

whoops, errore di battitura. Fisso. – thecoop

8

Il nome CLR per Generic List<T> con un parametro di tipo è

System.Collections.Generic.List`1 

List<T> è il C# stile di chiamare quel tipo.

La notazione è una convenzione definita per darti la possibilità di sovraccaricare i tipi generici mediante il conteggio dei parametri. Se si dichiara una classe denominata List con due parametri di tipo (ad esempio List<T,U>), il compilatore potrebbe scegliere quello giusto. Sarà chiamato:

System.Collections.Generic.List`2 

ed una classe non generico List si chiamerà:

System.Collections.Generic.List 

Si noti che il CLR non si richiedono tipi generici di essere nominato in quel modo. È solo una convenzione per i compilatori essere in grado di scegliere il tipo giusto.

+0

ho pensato che il CLI non ha cancellato i tipi generici? In caso contrario, dove si trova "String" quando "Lista " diventa List'1? –

+2

'Elenco ' diventa Elenco \ '1. È la "definizione di tipo generico aperto". La definizione chiusa di 'Lista ' diventerà List \ '1 [System.String]. –

+0

+1 per il punto in cui il CLR non richiede _questo. –

4

Non mostra List<string> perché è la sintassi dipendente da C#. Un elenco nel codice sorgente .Net potrebbe essere dichiarato come List<string>, List(Of String) o una qualsiasi delle altre 60 lingue/sintassi che possono essere compilate in MSIL.

Quindi quello che vedi è la sintassi MSIL più generica.

L'elemento `1 indica che si tratta di un elenco con un parametro generico.