Dalam C#, kekangan boleh diletakkan pada kaedah generik untuk memastikan keperluan khusus dipenuhi. Kekangan biasa adalah untuk menentukan bahawa jenis generik mesti mempunyai pembina tanpa parameter. Walau bagaimanapun, persoalan semula jadi timbul: bolehkah kita mengenakan kekangan yang lebih khusus pada pembina?
Mari kita ambil contoh yang disediakan dalam soalan, di mana kita mahu memaksa pembina yang menerima parameter float[,]. Percubaan awal:
<code class="language-c#">public static T Method<T>(T a) where T : new(float[,] u) { //...do something... return new T(new float[0, 0]); }</code>
Kompilasi gagal, memaksa kami mencari alternatif.
Untuk memintas pengehadan ini, kami menggunakan penyelesaian dengan memperkenalkan perwakilan yang bertanggungjawab untuk membuat contoh jenis T. Wakil ini mengambil parameter yang diperlukan sebagai parameter dan mengembalikan contoh T.
<code class="language-c#">public static void Method<T>(T a, Func<float[,], T> creator) { //...do something... }</code>
Ubah suai kod kami untuk menggunakan perwakilan ini, dengan keputusan berikut:
<code class="language-c#">A.Method(float[,], instanceCreator); Func<float[,], T> instanceCreator = (float[,] arr) => new T(arr);</code>
Penyelesaian ini membolehkan kami mengenakan kekangan yang lebih kompleks pada pembina dengan menghantar perwakilan yang sesuai.
Atas ialah kandungan terperinci Bolehkah Pembina Generik C# Menguatkuasakan Jenis Parameter Khusus Melebihi Pembina Tanpa Parameter?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!