所以,我正在從C++轉向C#(當然,不是'移動',而是訪問),我試圖移植一個C++項目作爲練習。我似乎無法找到任何引用我的特定問題的東西。我有一個模板類Rect -通用類,不同類型的運算符重載
template< class T >
class Rect
{
public:
Rect() {}
Rect(T top, T bottom, T left, T right)
:
top(top),
bottom(bottom),
left(left),
right(right)
{}
Rect(const Rect& rect)
:
top(rect.top),
bottom(rect.bottom),
left(rect.left),
right(rect.right)
{}
void Translate(float dx, float dy)
{
top += (T)dy;
bottom += (T)dy;
left += (T)dx;
right += (T)dx;
}
template< class T2 >
operator Rect<T2>() const
{
return Rect<int>((T2) top, (T2)bottom, (T2)left, (T2)right);
}
void ClipTo(const Rect& rect)
{
top = max(top, rect.top);
bottom = min(bottom, rect.bottom);
left = max(left, rect.left);
right = min(right, rect.right);
}
public:
T top;
T bottom;
T left;
T right;
};
問題是Translate(float dx,float dy)方法。看來我不能將一個float添加到'T'中,或者甚至不能使用'T'來輸入另一個變量?重載'+'運算符似乎不是答案(同樣的問題 - 類型不匹配)。我錯過了一些痛苦簡單的事情嗎?
不,你不是。不幸的是,在C#中,你不能用泛型類型的參數進行算術運算;在語言中沒有辦法將T約束爲「可加」,「可多」等類型。這是目前,恕我直言,類型系統的一個缺點。 – InBetween 2014-10-19 22:10:23
期待T是一個數字類型使用泛型中斷。 – RadioSpace 2014-10-19 22:14:10
@RadioSpace不,它不。爲什麼呢?遵循該邏輯,任何約束都會「打破」泛型。爲什麼'T:IFoo'有什麼不同?事實上,CLR團隊已經考慮過不止一次地解決這個問題:http://stackoverflow.com/a/6695760/767890 – InBetween 2014-10-19 22:18:23