2010-10-23 15 views
6

In caso contrario e l'insieme dei tipi di riferimento e tipi di valore si escludono a vicenda, perché non questo di compilazione:Un tipo può essere un tipo di riferimento e un tipo di valore allo stesso tempo?

stati
public static void Do<T>(T obj) where T : struct { } 
public static void Do<T>(T obj) where T : class { } 

il compilatore: "tipo già definisce un membro chiamato 'Do' con gli stessi tipi di parametri . ", ma T e T non sono la stessa cosa qui. Uno è vincolato alle strutture, l'altro è vincolo alle classi. Una chiamata alla funzione dovrebbe essere sempre risolvibile. Ci sono contro esempi?

+0

In realtà, uno è vincolato a "tipi di riferimento" (che include delegati, interfacce, ecc. - non solo classi) e l'altro è vincolato alle strutture ** eccetto ** il 50% delle (possibili) strutture coinvolte in 'Nullable '. Questi vincoli attualmente non consentono "T === int?", Per esempio. –

risposta

3

I vincoli generici non vengono presi come parte della corrispondenza di sovraccarico. È uguale al tipo di reso.

Ad esempio, questo porterà alla stesso errore (sovraccarichi differiscono solo tipo di ritorno):

public static int Do<T>(T obj) { } 
public static bool Do<T>(T obj) { } 

In entrambi i casi, le regole per corrispondenza a un sovraccarico prendere in considerazione solo i tipi parametri, ignorando informazioni aggiuntive quali vincoli e tipo di reso.

1

No, i tipi non possono mai essere entrambi. Il codice non funziona perché i parametri generici (lo <T>, ovvero non lo T obj) non hanno il concetto di "overloading". Né esiste qualcosa che assomigli alla specializzazione dei modelli C++.

+0

Sebbene sia possibile legare le cose in nodi su tipi di valore in box;) –

Problemi correlati