variable - Ayuda con el error genérico C#- "El tipo ''T'' debe ser un tipo de valor que no admite nulos"
generic variable c# (4)
El tipo Nullable<T>
tiene una restricción que requiere que T
sea un tipo de valor ( struct
en C #). Es por eso que el compilador le dice acerca de Nullable<T>
y no su función o el sitio de llamada de esa función - es la clase de Nullable
que es la causa raíz del error, por lo que esto es más útil que si el compilador solo apunta a su función y dijo "esto no está bien, ¡arréglenlo!" (Imagínese si CoalesceMax
usó varios genéricos y violó la restricción en solo uno de ellos; es más útil saber qué genérico tiene su restricción rota que solo saber que una o más restricciones en CoalesceMax
se rompieron).
La solución es hacer que su T
y su T
compatibles al introducir la misma restricción. Esto se hace agregando la restricción de struct
, que debe venir antes de todas las restricciones de interfaz / nuevas:
public static Nullable<T> CoalesceMax<T>(Nullable<T> a, Nullable<T> b) where T : struct, IComparable{
...
}
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 que no admite nulos para usarlo como parámetro ''T'' en el tipo genérico o método ''System.Nullable <T>''
Necesita agregar una restricción T: struct:
public static Nullable<T> CoalesceMax<T>
(Nullable<T> a, Nullable<T> b) where T : struct, IComparable
De lo contrario, C # intentará determinar qué Nullable<T>
y darse cuenta de que ya no tiene la restricción requerida por Nullable<T>
. En otras palabras, podrías intentar llamar:
CoalesceMax<string>(...)
lo cual no tendría sentido, ya que Nullable<string>
no es válido.
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
public class MyClass<T> where T : struct
{
public void MyMethod(T? value)
{
}
}
Su método genérico está usando un Nullable<T>
.
Sin embargo, no estás restringiendo el tipo de T
, por lo que podría terminar siendo Nullable<Form>
, que obviamente no es válido.
Debe cambiar la restricción a where T : struct, IComparable
para asegurar que T
solo puede ser un tipo de valor.