Soy nuevo en C # y no entiendo por qué el siguiente código no funciona.
public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : IComparable
{
if (a.HasValue && b.HasValue)
return a.Value.CompareTo(b.Value) < 0 ? b : a;
else if (a.HasValue)
return a;
else
return b;
}
// Sample usage:
public DateTime? CalculateDate(DataRow row)
{
DateTime? result = null;
if (!(row["EXPIRATION_DATE"] is DBNull))
result = DateTime.Parse((string)row["EXPIRATION_DATE"]);
if (!(row["SHIPPING_DATE"] is DBNull))
result = CoalesceMax(
result
DateTime.Parse((string)row["SHIPPING_DATE"]).AddYears(1));
// etc.
return result;
}
Da el siguiente error durante la compilación:
El tipo 'T' debe ser un tipo de valor no anulable para poder usarlo como parámetro 'T' en el tipo o método genérico 'System.Nullable <T>'
Respuestas:
Necesita agregar una
T : struct
restricción:De lo contrario, C # intentará averiguar qué
Nullable<T>
significa y se dará cuenta de que aún no tiene la restricción requerida porNullable<T>
sí mismo. En otras palabras, podría intentar llamar a:que no tendría sentido, ya
Nullable<string>
que no es válido.fuente
El
Nullable<T>
tipo tiene una restricción que requiereT
ser un tipo de valor (struct
en C #). Es por eso que el compilador le está informando sobreNullable<T>
su función o el sitio de llamada de esa función, y no sobre su función; es laNullable
clase la que es la causa raíz del error, por lo que esto es realmente más útil que si el compilador simplemente señaló su función y dijo "¡Esto no está bien, arréglalo!" (Imagínese siCoalesceMax
usa varios genéricos y violó la restricción en solo uno de ellos; es más útil saber qué genérico tuvo su restricción rota que saber simplemente que una o más restriccionesCoalesceMax
se rompieron).La solución es hacer que usted
T
y ellos seanT
compatibles introduciendo la misma restricción. Esto se hace agregando lastruct
restricción, que debe venir antes de todas las interfaces / nuevas restricciones:fuente
Su método genérico está usando un
Nullable<T>
.Sin embargo, no está restringiendo el tipo de
T
, por lo que podría terminar siendoNullable<Form>
, lo que obviamente no es válido.Debe cambiar la restricción para
where T : struct, IComparable
asegurarse de queT
solo pueda ser un tipo de valor.fuente
No es exactamente una respuesta al OP, pero como esto fue lo primero que apareció en Google para el mismo mensaje de error, tuve que agregar la restricción en la definición de mi clase, en lugar de mi método, por ejemplo
fuente