Kekangan Generik: Membezakan Antara Nilai dan Rujukan
Dalam C#, kekangan generik boleh digunakan untuk menguatkuasakan keperluan khusus pada parameter jenis. Ini amat berguna apabila membezakan antara jenis nilai, jenis nilai boleh null dan jenis rujukan.
Kekangan untuk Nilai dan Jenis Nilai Boleh Null
Pertimbangkan kod berikut, yang membezakan antara jenis nilai biasa dan jenis nilai boleh null:
static void Foo<T>(T a) where T : struct { } // Plain value type (e.g. int) static void Foo<T>(T? a) where T : struct { } // Nullable value type (e.g. int?)
Kekangan untuk Jenis Rujukan
Walau bagaimanapun, percubaan untuk mentakrifkan kekangan untuk jenis rujukan menggunakan kelas di mana T : menghasilkan ralat pengkompil. Ini kerana kekangan dikuatkuasakan semasa resolusi beban lampau dan parameter diutamakan daripada kekangan.
Untuk menyelesaikan isu ini, kekangan boleh diletakkan dalam parameter, walaupun dalam cara yang kurang elegan:
class RequireStruct<T> where T : struct { } class RequireClass<T> where T : class { } static void Foo<T>(T a, RequireStruct<T> ignore = null) where T : struct { } // Plain value type static void Foo<T>(T? a) where T : struct { } // Nullable value type static void Foo<T>(T a, RequireClass<T> ignore = null) where T : class { } // Reference type
Dengan meletakkan kekangan dalam parameter pilihan abaikan, pengkompil boleh membezakan antara kes yang berbeza tanpa bercanggah dengan jenis parameter. Ini membolehkan pemetaan jenis rujukan yang dimaksudkan kepada lebihan fungsi yang betul.
Atas ialah kandungan terperinci Bagaimanakah Kekangan Generik C# Boleh Membezakan Antara Jenis Nilai, Jenis Nilai Boleh Null dan Jenis Rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!