ホームページ > バックエンド開発 > C++ > C# の制約されたジェネリック クラスで算術演算子をオーバーロードするにはどうすればよいですか?

C# の制約されたジェネリック クラスで算術演算子をオーバーロードするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2025-01-11 12:57:42
オリジナル
242 人が閲覧しました

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

C# の制限されたジェネリック クラスでの算術演算子のオーバーロード

C# では、制約のあるジェネリック クラスの算術演算子を定義すると課題が生じる可能性があります。次の汎用クラス定義を考えてみましょう:

<code class="language-csharp">public class ConstrainedNumber<T></code>
ログイン後にコピー

その中で、IComparable や IEquatable などの制約は、int や float などのプリミティブな数値型に課されます。

T 自体には固有の算術演算子がないため、構文 public static T operator (ConstrainedNumber<T> x, ConstrainedNumber<T> y) を使用してこのクラスの算術演算子を定義すると失敗します。

IConvertible を使用したソリューション

解決策の 1 つは、IConvertible を制約として使用することです。このインターフェイスは自動型変換をサポートしており、さまざまなプリミティブ型の操作が可能です。ただし、String や DateTime などの一部の型は算術演算子をサポートしておらず、実装時に手動によるチェックや制限が必要であることに注意することが重要です。

以下は、IConvertible を使用した演算子のオーバーロードの例です。

<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>
ログイン後にコピー

IConvertible を使用すると、サポートされていない型を適切に処理しながら、さまざまなプリミティブ数値型に対して算術演算を実行できます。これは、C# で制約のあるジェネリック クラスに算術演算子を追加するためのソリューションを提供します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート