desidero distinguere seguenti casi:vincoli generici, dove T: struct e dove T: classe
- Un tipo valore normale (es
int
) - Un tipo valore nullable (es
int?
) - Un tipo di riferimento (es
string
) - opzionalmente, non mi importa se questo mappato (1) o (2) di cui sopra
ho fornito con il seguente c ode, che funziona bene per i casi (1) e (2):
static void Foo<T>(T a) where T : struct { } // 1
static void Foo<T>(T? a) where T : struct { } // 2
Tuttavia, se provo a rilevare caso (3) come questo, non viene compilato:
static void Foo<T>(T a) where T : class { } // 3
L'errore il messaggio è Il tipo 'X' definisce già un membro chiamato 'Foo' con gli stessi tipi di parametro. Beh, in qualche modo non posso fare la differenza tra where T : struct
e where T : class
.
Se rimuovo la terza funzione (3), il seguente codice non compilato o:
int x = 1;
int? y = 2;
string z = "a";
Foo (x); // OK, calls (1)
Foo (y); // OK, calls (2)
Foo (z); // error: the type 'string' must be a non-nullable value type ...
Come posso ottenere Foo(z)
per compilare, la mappatura ad una delle funzioni di cui sopra (o un terzo con un altro vincolo, a cui non ho pensato)?
Per i tipi di riferimento c'è: new(), ma questo ha un comportamento strano con tipi di valore nullable. –