Operator aritmetik kelas generik C# terlampau beban
Dalam C#, disebabkan oleh kekangan jenis, operator aritmetik melebihkan kelas generik memerlukan pertimbangan khusus. Apabila menggunakan definisi kelas generik seperti ini:
<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>
Kami menemui had dalam menggunakan kaedah langsung untuk menentukan pengendali aritmetik:
<code class="language-csharp">public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y) { return x._value + y._value; }</code>
Kod ini gagal disusun kerana operator ' ' tidak boleh digunakan pada jenis 'T' dan 'T' kerana sifat generik 'T'.
Untuk menyelesaikan masalah ini, kami memerlukan kekangan khusus untuk jenis berangka dengan pengendali aritmetik. Malangnya, C# tidak menyediakan kekangan "IArithmetic" khusus.
Alternatifnya ialah menggunakan kekangan 'ICConvertible', yang membolehkan kami mengendalikan operasi aritmetik secara manual:
<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)(object)(x.ToDouble(NumberFormatInfo.CurrentInfo) + y.ToDouble(NumberFormatInfo.CurrentInfo)); } catch (Exception ex) { throw new ApplicationException("The operation failed.", ex); } }</code>
Kod ini menyemak jenis yang tidak disokong seperti 'rentetan' dan 'DateTime', kemudian menukar 'x' dan 'y' kepada dua kali ganda, melakukan operasi aritmetik dan menukarkan hasilnya kembali kepada 'T'.
Walaupun pendekatan ini membolehkan kami membebankan operator aritmetik untuk jenis numerik generik, adalah penting untuk ambil perhatian bahawa pendekatan ini mungkin tidak mengendalikan semua kes yang berpotensi dengan anggun.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Membebankan Operator Aritmetik untuk Jenis Nombor Generik dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!