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?
statipublic 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?
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. –