Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Pengendali Aritmetik Boleh Dibebankan untuk Kelas Generik dalam C# dengan Sokongan Operasi Aritmetik?

Bagaimanakah Pengendali Aritmetik Boleh Dibebankan untuk Kelas Generik dalam C# dengan Sokongan Operasi Aritmetik?

Susan Sarandon
Lepaskan: 2025-01-11 12:51:46
asal
352 orang telah melayarinya

How Can Arithmetic Operators Be Overloaded for Generic Classes in C# with Arithmetic Operation Support?

Operator aritmetik kelas generik C# terlampau beban

Mendefinisikan pengendali aritmetik menggunakan kelas generik dalam C# boleh menjadi satu cabaran. Ini benar terutamanya apabila jenis generik dihadkan kepada jenis tertentu yang menyokong operasi aritmetik. Mari kita terokai senario khusus untuk menggambarkan cabaran ini dan menyediakan penyelesaian yang mungkin.

Pertimbangkan nombor terhad pemodelan definisi kelas generik berikut:

<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

Kelas ini mewakili nombor terhad, menyokong perbandingan kesaksamaan dan susunan semula jadi. Walau bagaimanapun, untuk melaksanakan operasi aritmetik pada contoh kelas ini, kita perlu menentukan pengendali yang sepadan.

Salah satu cara ialah dengan mentakrifkan operator seperti ini:

<code class="language-csharp">public static T operator +(ConstrainedNumber<T> x, ConstrainedNumber<T> y)
{
    return x._value + y._value;
}</code>
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini gagal untuk disusun kerana operator ' ' tidak boleh digunakan secara langsung untuk menaip 'T'. Untuk menyelesaikan masalah ini, kita memerlukan kekangan untuk menentukan bahawa 'T' ialah jenis yang menyokong operasi aritmetik. Malangnya, tiada kekangan sedemikian dalam C#.

Sebagai alternatif, kita boleh menggunakan antara muka IConvertible sebagai kekangan dan secara manual menukar 'T' kepada jenis yang sesuai untuk menjalankan operasi aritmetik:

<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

Kaedah ini menggunakan antara muka IConvertible untuk menukar 'T' kepada dua kali ganda, melakukan operasi aritmetik, dan kemudian menukar hasil kembali kepada menaip 'T'. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa pendekatan ini mungkin tidak sesuai untuk semua senario dan mungkin perlu disesuaikan berdasarkan keperluan khusus aplikasi.

Atas ialah kandungan terperinci Bagaimanakah Pengendali Aritmetik Boleh Dibebankan untuk Kelas Generik dalam C# dengan Sokongan Operasi Aritmetik?. 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