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
Lepaskan: 2025-01-11 12:47:42
asal
283 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan