me gustaría diferenciar entre casos siguientes:limitaciones genérico, donde T: struct y donde T: clase
- un tipo de valor simple (por ejemplo,
int
) - un tipo de valor anulable (por ejemplo
int?
) - un tipo de referencia (por ejemplo
string
) - opcionalmente, no me importa si esta asignada a (1) o (2) por encima de
he llegado con la siguiente c oda, que funciona bien para los casos (1) y (2):
static void Foo<T>(T a) where T : struct { } // 1
static void Foo<T>(T? a) where T : struct { } // 2
Sin embargo, si intento de detectar el caso (3) de este tipo, no se compila:
static void Foo<T>(T a) where T : class { } // 3
El error el mensaje es El tipo 'X' ya define un miembro llamado 'Foo' con los mismos tipos de parámetros. Bueno, de alguna manera no puedo hacer la diferencia entre where T : struct
y where T : class
.
Si quito la tercera función (3), el siguiente código no se compila ya sea:
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 ...
¿Cómo puedo obtener Foo(z)
para compilar, la cartografía a una de las funciones anteriores (o un tercero con otra restricción, que no he pensado)?
Para los tipos de referencia se encuentra: new(), sin embargo, esto tiene un comportamiento extraño con los tipos de valor anulables. –