Operator aritmetik berangka generik C# terlebih beban
Dalam C#, mentakrifkan pengendali aritmetik untuk kelas generik boleh menjadi mencabar, terutamanya apabila berurusan dengan jenis angka terhalang. Mari kita kaji kes tertentu:
Pernyataan Masalah:
Diberi definisi kelas generik:
<code class="language-csharp">public class ConstrainedNumber<T> : IEquatable<ConstrainedNumber<T>>, IEquatable<T>, IComparable<ConstrainedNumber<T>>, IComparable<T>, IComparable where T : struct, IComparable, IComparable<T>, IEquatable<T></code>
Bagaimanakah kita mentakrifkan pengendali aritmetik untuk kelas ini?
Percubaan yang gagal:
<code class="language-csharp">public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y) { return x._value + y._value; }</code>
Kod ini tidak menyusun kerana operator ' ' tidak boleh digunakan pada jenis 'T' dan 'T'.
Kekangan pada operator aritmetik:
Untuk menyelesaikan masalah ini, kami memerlukan kekangan pada jenis angka yang menyokong pengendali aritmetik. Walau bagaimanapun, C# tidak memberikan kekangan sedemikian secara eksplisit.
Penyelesaian menggunakan IConvertible:
Sebagai alternatif, kami boleh menggunakan antara muka IConvertible
sebagai kekangan dan melaksanakan operasi menggunakan kaedahnya. Berikut ialah contoh:
<code class="language-csharp">public static T operator +(T x, T y) where T : IConvertible { var type = typeof(T); if (type == typeof(string) || type == typeof(DateTime)) throw new ArgumentException(string.Format("The type {0} is not supported", type.FullName), "T"); try { return (T)Convert.ChangeType(x.ToDouble(NumberFormatInfo.CurrentInfo) + y.ToDouble(NumberFormatInfo.CurrentInfo), type); } catch (Exception ex) { throw new ApplicationException("The operation failed.", ex); } }</code>
Penyelesaian ini menggunakan antara muka IConvertible
untuk menukar nilai kepada dua kali ganda, melaksanakan operasi dan menukar hasil kembali kepada jenis asal. Kaedah Convert.ChangeType
digunakan di sini untuk penukaran jenis yang lebih dipercayai.
Walaupun kaedah ini boleh disesuaikan dengan julat jenis yang lebih luas, adalah penting untuk ambil perhatian bahawa ia tidak mudah dan boleh mengeluarkan pengecualian jika operasi tidak disokong untuk jenis yang ditentukan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membebankan Operator Aritmetik untuk Kelas Berangka Generik dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!