Je suis nouveau en C # et je ne comprends pas pourquoi le code suivant ne fonctionne pas.
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;
}
Il donne l'erreur suivante lors de la compilation:
Le type 'T' doit être un type valeur non Nullable pour pouvoir l'utiliser comme paramètre 'T' dans le type ou la méthode générique 'System.Nullable <T>'
Réponses:
Vous devez ajouter une
T : struct
contrainte:Sinon, C # essaiera de comprendre ce que
Nullable<T>
signifie et réalisera qu'il n'a pas déjà la contrainte requise parNullable<T>
lui-même. En d'autres termes, vous pouvez essayer d'appeler:ce qui n'aurait pas de sens, car ce
Nullable<string>
n'est pas valide.la source
Le
Nullable<T>
type a une contrainte qui nécessiteT
d'être un type valeur (struct
en C #). C'est pourquoi le compilateur vous parleNullable<T>
et non de votre fonction ou du site d'appel de cette fonction - c'est laNullable
classe qui est la cause première de l'erreur, donc c'est en fait plus utile que si le compilateur a juste pointé votre fonction et dit "Ce n'est pas bien, réparez-le!" (Imaginez si vousCoalesceMax
utilisez plusieurs génériques et enfreignez la contrainte sur un seul d'entre eux - il est plus utile de savoir quel générique a eu sa contrainte cassée que de simplement savoir qu'une ou plusieurs contraintes dansCoalesceMax
ont été rompues).La solution est de rendre votre
T
et leurT
compatible en introduisant la même contrainte. Cela se fait en ajoutant lastruct
contrainte, qui doit précéder toutes les interfaces / nouvelles contraintes:la source
Votre méthode générique utilise un
Nullable<T>
.Cependant, vous ne contraignez pas le type de
T
, donc cela pourrait finir par êtreNullable<Form>
, ce qui est évidemment invalide.Vous devez modifier la contrainte sur
where T : struct, IComparable
pour vous assurer qu'ilT
ne peut s'agir que d'un type valeur.la source
Pas exactement une réponse à l'OP mais comme c'était la première chose qui est apparue sur google pour le même message d'erreur, j'ai dû ajouter la contrainte sur ma définition de classe, plutôt que sur ma méthode, par exemple
la source