ホームページ >バックエンド開発 >C++ >算術演算サポートを使用して C# のジェネリック クラスに対して算術演算子をオーバーロードするにはどうすればよいですか?

算術演算サポートを使用して C# のジェネリック クラスに対して算術演算子をオーバーロードするにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-11 12:51:46394ブラウズ

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

C# ジェネリック クラス算術演算子のオーバーロード

C# でジェネリック クラスを使用して算術演算子を定義するのは難しい場合があります。これは、ジェネリック型が算術演算をサポートする特定の型に制約されている場合に特に当てはまります。この課題を説明し、考えられる解決策を提供するために、特定のシナリオを検討してみましょう。

制限された数値をモデリングする次の汎用クラス定義を考えてみましょう:

<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>

このクラスは制限された数値を表し、等価比較と自然な順序付けをサポートします。ただし、このクラスのインスタンスに対して算術演算を実行するには、対応する演算子を定義する必要があります。

1 つの方法は、次のように演算子を定義することです:

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

ただし、' ' 演算子を型 'T' に直接適用できないため、このアプローチはコンパイルに失敗します。この問題を解決するには、「T」が算術演算をサポートする型であることを指定する制約が必要です。残念ながら、C# にはそのような制約はありません。

代わりに、IConvertible インターフェイスを制約として使用し、'T' を算術演算の実行に適した型に手動で変換できます。

<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>
このメソッドは、

インターフェイスを利用して 'T' を double に変換し、算術演算を実行し、結果を型 'T' に変換します。ただし、このアプローチはすべてのシナリオに適しているわけではなく、アプリケーションの特定のニーズに基づいてカスタマイズする必要がある場合があることに注意することが重要です。 IConvertible

以上が算術演算サポートを使用して C# のジェネリック クラスに対して算術演算子をオーバーロードするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。