2010-07-10 11 views
7
class Program 
{ 
    static void Main(string[] args) 
    { 
     Type t = typeof(A<,>); 
     Console.WriteLine(typeof(A<,>)); // prints A'2[T1,T2] 
    }  
} 

class A<T1,T2> 
{ 

} 

Per quanto ne so, tipo generico A<T1, T2> non è un tipo effettivo, ma piuttosto un progetto/modello per un tipo effettivo, quindi perché non typeof accetto come parametro (dal momento che per quanto ne so, typeof accetta come parametro i tipi effettivi)?Se A <T1,T2> è un modello per il tipo effettivo, perché è consentito il tipoof (A <,>)?

Grazie

+0

domanda molto buona +1 – nawfal

risposta

4

In riflessione il tipo generico non costruito, diciamo C<> si fusero con il tipo esempioC<T>.

Questo è forse meno teoricamente puro; Penso a questi come entità molto diverse. Penso a uno come il simbolo "C con un parametro di tipo" e l'altro come tipo di compilazioneC<T>. Nel codice, C<> e C<T> non sono sinonimi l'uno dell'altro; puoi creare un campo di quest'ultimo tipo se T è in ambito, ma non puoi mai creare un campo del primo tipo.

Che la libreria di riflessione fornisca il tipo del tipo di istanza quando si chiede il tipo non ricostruito non è poi così male. Cosa vorresti fare con il tipo non ricostruito? Non c'è niente che tu possa veramente fare con questo. Ma con il tipo di istanza, puoi dire "sostituto int per T" qui.

Il vero vantaggio di ottenere C<T> quando si chiede per typeof(C<>) è che questo ti dà sempre il tipo non ricostruito. Confronta:

class C<T> 
{ 
    public static Type CT() { return typeof(C<T>); } 
    public static Type JustC() { return typeof(C<>); } 
} 

Quando si chiama CT, che cosa hai intenzione di chiamare su? Non c'è nessun tipo C<T> per chiamare CT. È possibile chiamare C<int>.CT in tal caso si torna C<int>, non C<T>. L'unico modo per ottenere il tipo C<> costruito con T è chiedere typeof(C<>).

Ha senso?

Non ho ancora coperto di riflessione (ho una vaga idea di cosa si tratta)

riflessione è semplicemente la libreria di codice che consente di ottenere informazioni sul codice nel codice stesso . "typeof" ti dà un oggetto Type che puoi quindi "riflettere" per trovare informazioni sul tipo.

io non sono sicuro di capire cosa si intende per "anche quando T non è di portata"

Il modo in cui ho detto che era confusa. L'ho riformulato.

+0

1 - "Ha senso?" Un po ', ma non ho ancora coperto la riflessione (ho una vaga idea di cosa sia) e sono più stupido. 2 - "Il vero vantaggio è che typeof (C <>) consente di ottenere l'oggetto tipo per C anche quando T non è in ambito" Non sono sicuro di capire cosa intendi con "anche quando T è non nel campo di applicazione "? 2 - "Che la libreria di riflessioni ti dia il tipo di tipo di istanza quando chiedi il tipo non ricostruito non è poi così male."Suppongo che qui non si parli di typeof (A <,>), dal momento che questo non ti dà un'istanza di tipo A flockofcode

+0

" Che la libreria di riflessione ti dia il tipo del tipo di istanza quando chiedi il non ricostruito il tipo non è poi così male. "La terminologia che usi è un po 'confusa, dici che typeof (C <>) restituisce il tipo di un tipo di istanza, quindi restituisce il tipo di C , dove T non è stato ancora specificato. la mia comprensione implica che C è un tipo di istanza, mentre per i miei tipi di istanza di conoscenza sono stati determinati tutti i parametri del tipo ?! – flockofcode

+1

@flockofcode: Infatti, la terminologia è * molto * confusa.La specifica definisce il "tipo di istanza" di un tipo generico come il tipo che è il tipo * di compilazione * del tipo costruito con i suoi parametri di tipo.Ad esempio, nella classe C {C x; } il tipo * compile time * di x è il * tipo di istanza * del parametro C-with-one-type. Il tipo di runtime di x dipenderà ovviamente dall'argomento type sostituito per T –

4

E 'accettato perché è un tipo generico.

È un tipo generico aperto (in cui non sono stati specificati i parametri), ma un tipo non di meno.

Vedere la discussione here (Che cos'è esattamente un "tipo generico aperto").

E sul MSDN (typeof):

L'operatore typeof può essere utilizzato anche sui tipi generici aperti.

+0

1-Sareste d'accordo che in senso stretto A non è un tipo effettivo? 2-Qual è la differenza tra tipo generico aperto e tipo generico aperto aperto? – flockofcode

+3

@flockofcode - 1. i tipi generici aperti sono tipi. Non possono essere istanziati senza fornire parametri di tipo, ma sono ancora tipi. 2. Un tipo aperto costruito è quando almeno uno dei tipi generici non è stato specificato. Vedi qui: http://en.csharp-online.net/Generic_types – Oded

+0

1) "i tipi generici aperti sono tipi" Per quanto ne so, non c'è modo per il metodo di avere come uno dei suoi parametri un tipo generico aperto aperto ? 2) Quindi diciamo che A {} è un tipo aperto, mentre A è un tipo generico aperto. Ma non potremmo obiettare che A è anche un tipo aperto aperto (se no, allora la definizione di un tipo aperto dovrebbe dire che il tipo aperto deve avere almeno uno dei suoi argomenti tipo specificati, altrimenti è un tipo generico aperto) ?! – flockofcode

1

Perché A<T1, T2> è un open generica, che la documentation esplicitamente dice che supporta.

+1

Qual è la differenza tra tipo generico aperto e tipo generico aperto aperto? – flockofcode

Problemi correlati