Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Kekangan Generik C# Boleh Membezakan Antara Jenis Nilai, Jenis Nilai Boleh Null dan Jenis Rujukan?

Bagaimanakah Kekangan Generik C# Boleh Membezakan Antara Jenis Nilai, Jenis Nilai Boleh Null dan Jenis Rujukan?

Linda Hamilton
Linda Hamiltonasal
2025-01-02 17:13:39704semak imbas

How Can C# Generic Constraints Distinguish Between Value Types, Nullable Value Types, and Reference Types?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn