Jestem nowy w C # i nie rozumiem, dlaczego poniższy kod nie działa.
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;
}
Podczas kompilacji daje następujący błąd:
Typ „T” musi być typem wartości niepodlegającym wartości null, aby można go było użyć jako parametru „T” w typie lub metodzie ogólnej „System.Nullable <T>”
Odpowiedzi:
Musisz dodać
T : struct
ograniczenie:W przeciwnym razie C # spróbuje dowiedzieć się, co to
Nullable<T>
znaczy i zda sobie sprawę, że nie ma już ograniczenia wymaganego przezNullable<T>
siebie. Innymi słowy, możesz spróbować zadzwonić:co nie miałoby sensu, ponieważ
Nullable<string>
nie jest ważne.źródło
Nullable<T>
nadal musiT
być typem wartości niedopuszczającym wartości null, a nie tylko typem niedopuszczającym wartości null.Nullable<T>
Typu ma ograniczenia na to, że wymagaT
, aby być typem wartość (struct
w C #). Dlatego kompilator mówi ci o funkcji,Nullable<T>
a nie stronie wywołania tej funkcji - toNullable
klasa jest główną przyczyną błędu, więc jest to bardziej pomocne, jeśli kompilator po prostu wskazał twoją funkcję i powiedział „to nie w porządku, napraw to!” (Wyobraź sobie, żeCoalesceMax
użyłeś kilku rodzajów i naruszyłeś ograniczenie tylko jednego z nich - bardziej przydatna jest wiedza, który rodzaj generyczny ma złamane ograniczenie, niż po prostu wiedzieć, że jedno lub więcej ograniczeń w programieCoalesceMax
zostało zerwanych).Rozwiązaniem jest uczynienie Ciebie
T
i ichT
kompatybilnych poprzez wprowadzenie tego samego ograniczenia. Odbywa się to poprzez dodaniestruct
ograniczenia, które musi występować przed wszystkimi interfejsami / nowymi ograniczeniami:źródło
Twoja ogólna metoda używa pliku
Nullable<T>
.Jednak nie ograniczasz rodzaju
T
, więc może to skończyć się byciemNullable<Form>
, co jest oczywiście nieprawidłowe.Musisz zmienić ograniczenie, aby
where T : struct, IComparable
upewnić się, żeT
może to być tylko typ wartości.źródło
Nie do końca odpowiedź na OP, ale ponieważ była to pierwsza rzecz, która wyskoczyła w Google z tym samym komunikatem o błędzie, musiałem dodać ograniczenie do mojej definicji klasy, a nie mojej metody, np.
źródło