Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Membebankan Operator Aritmetik untuk Jenis Nombor Generik dalam C#?

Bagaimanakah Saya Boleh Membebankan Operator Aritmetik untuk Jenis Nombor Generik dalam C#?

Barbara Streisand
Barbara Streisandasal
2025-01-11 12:47:42284semak imbas

How Can I Overload Arithmetic Operators for Generic Number Types in C#?

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!

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