Saya baru mengenal C # dan tidak mengerti mengapa kode berikut tidak berfungsi.
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;
}
Ini memberikan kesalahan berikut selama kompilasi:
Jenis 'T' harus berupa jenis nilai yang tidak dapat dinolkan untuk menggunakannya sebagai parameter 'T' dalam jenis umum atau metode 'System.Nullable <T>'
Jawaban:
Anda perlu menambahkan
T : struct
batasan:Jika tidak, C # akan mencoba mencari tahu apa
Nullable<T>
artinya, dan menyadari bahwa ia belum memiliki batasan yang dibutuhkan denganNullable<T>
sendirinya. Dengan kata lain, Anda dapat mencoba menelepon:yang tidak masuk akal, karena
Nullable<string>
tidak valid.sumber
The
Nullable<T>
jenis memiliki kendala di atasnya yang membutuhkanT
untuk menjadi tipe nilai (struct
dalam C #). Itulah mengapa kompilator memberi tahu Anda tentangNullable<T>
dan bukan fungsi Anda atau situs panggilan dari fungsi itu -Nullable
kelaslah yang menjadi akar penyebab kesalahan, jadi ini sebenarnya lebih membantu jika kompilator hanya menunjuk ke fungsi Anda dan berkata "ini tidak benar, perbaiki!" (Bayangkan jikaCoalesceMax
menggunakan beberapa obat generik, dan melanggar batasan hanya pada salah satunya - lebih berguna untuk mengetahui generik mana yang batasannya rusak daripada hanya mengetahui bahwa satu atau lebih batasan diCoalesceMax
rusak).Solusinya adalah membuat Anda
T
dan merekaT
kompatibel dengan memperkenalkan batasan yang sama. Ini dilakukan dengan menambahkanstruct
batasan, yang harus ada sebelum semua antarmuka / batasan baru:sumber
Metode umum Anda menggunakan file
Nullable<T>
.Namun, Anda tidak membatasi jenisnya
T
, jadi itu bisa berakhirNullable<Form>
, yang jelas tidak valid.Anda perlu mengubah batasan
where T : struct, IComparable
untuk memastikan bahwaT
hanya bisa menjadi tipe nilai.sumber
Bukan jawaban yang tepat untuk OP tetapi karena ini adalah hal pertama yang muncul di google untuk pesan kesalahan yang sama, saya harus menambahkan batasan pada definisi kelas saya, daripada metode saya, misalnya
sumber