E perché non mostra il tipo reale (ad esempio: lista <stringa> anziché List`1)?
Da dove viene questa strana (per me) notazione?Perché il runtime mostra i tipi generici come "GenericType`n"?
risposta
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]
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.
ho pensato che il CLI non ha cancellato i tipi generici? In caso contrario, dove si trova "String" quando "Lista
'Elenco
+1 per il punto in cui il CLR non richiede _questo. –
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.
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. –
whoops, errore di battitura. Fisso. – thecoop