3 回答

TA貢獻1788條經(jīng)驗 獲得超4個贊
我認為你能做的最好的事情是IConvertible
用作約束并做類似的事情:
public static operator T +(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); }}
這不會阻止某人傳遞String或DateTime,所以你可能想要做一些手動檢查 - 但IConvertible應該讓你足夠接近,并允許你進行操作。

TA貢獻1860條經(jīng)驗 獲得超8個贊
遺憾的是,沒有辦法將泛型參數(shù)約束為整數(shù)類型(編輯:我猜“算術類型”可能是一個更好的詞,因為這不僅僅與整數(shù)有關)。
能夠做這樣的事情會很高興:
where T : integral // or "arithmetical" depending on how pedantic you are
要么
where T : IArithmetic
我建議您通過我們自己的Marc Gravell和Jon Skeet 閱讀Generic Operators。它解釋了為什么這是一個如此困難的問題,以及可以采取哪些措施來解決它。
.NET 2.0在.NET世界中引入了泛型,為現(xiàn)有問題的許多優(yōu)雅解決方案打開了大門。通用約束可用于將類型參數(shù)限制為已知接口等,以確保對功能的訪問 - 或者對于簡單的相等/不等性測試,Comparer.Default和EqualityComparer.Default單例分別實現(xiàn)IComparer和IEqualityComparer(允許我們對元素進行排序)例如,無需了解有關“T”的任何信息。
盡管如此,在運營商方面仍存在很大差距。因為運算符被聲明為靜態(tài)方法,所以沒有所有數(shù)值類型實現(xiàn)的IMath或類似的等效接口; 事實上,運營商的靈活性會使這項工作變得非常困難。更糟糕的是:原始類型的許多運算符甚至不作為運算符存在; 相反,有直接的IL方法。[強調(diào)我的]為了使情況更加復雜,Nullable <>要求“提升運算符”的概念,其中內(nèi)部“T”描述適用于可空類型的運算符 - 但這是作為語言特征實現(xiàn)的,并且是不是由運行時提供的(使反射更有趣)。
- 3 回答
- 0 關注
- 1177 瀏覽
添加回答
舉報