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

Bagaimanakah Saya Boleh Membebankan Operator Aritmetik untuk Kelas Berangka Generik dalam C#?

Barbara Streisand
Lepaskan: 2025-01-11 12:36:42
asal
537 orang telah melayarinya

How Can I Overload Arithmetic Operators for Generic Numerical Classes in C#?

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

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

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

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!

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