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>
此類表示一個受限數字,支援相等比較和自然排序。但是,要對該類別的實例執行算術運算,我們需要定義對應的運算子。
一種方法是定義如下運算子:
<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>
這個方法利用IConvertible
介面將'T'轉換為double,執行算術運算,然後將結果轉換回型別'T'。但是,需要注意的是,這種方法可能並不適用於所有場景,可能需要根據應用程式的特定需求進行自訂。
以上是如何在支援算術運算的 C# 中為泛型類別重載算術運算子?的詳細內容。更多資訊請關注PHP中文網其他相關文章!