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.
- 1. Come confrontare i tipi generici?
- 2. Elenca i tipi chiusi che il runtime ha creato da tipi generici aperti
- 3. Perché i tipi generici non possono avere un layout esplicito?
- 4. Guice: come legare i generici per TUTTI i tipi?
- 5. perché e cosa dei tipi generici polimorfi
- 6. perché un [n] è accettato in c durante il runtime?
- 7. Generici C#: è possibile creare un metodo con n Tipi generici ...?
- 8. Rust cancella i tipi generici o no?
- 9. Marshalling .NET tipi generici
- 10. Devo evitare i tipi annidati nei tipi generici?
- 11. tipi anonimi e generici
- 12. con tipi generici
- 13. Raccolta di tipi generici
- 14. I tipi vengono cancellati prima del runtime
- 15. Raccolta dei tipi generici
- 16. Tipi generici ricorsivi
- 17. intesa anomalia sicurezza rispetto ai tipi con i generici Java
- 18. Tipi instantiating generici
- 19. Come utilizzare i tipi generici parametrizzati in una classe interna?
- 20. Come funzionano i generici in C++/CX
- 21. Utilizzando vincoli generici con i tipi di valore
- 22. Come ottenere il compilatore C# per inferire tipi generici?
- 23. C# Perché non è possibile aprire i tipi generici come parametri?
- 24. raccolta di diversi tipi generici
- 25. Perché i tipi di riferimento di boxe?
- 26. NET: i tipi generici dedotto sui metodi statici
- 27. I tipi di dati MakeGenericType/generici vengono raccolti?
- 28. generici Java e tipi numerici
- 29. polimorfismo C# in tipi generici
- 30. Perché utilizzare i vincoli generici in C#
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