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 サイトの他の関連記事を参照してください。