2011-07-31 23 views
4

在聲明二元運算符時,至少有一個操作數類型必須是包含類型。這聽起來總體上是一個很好的設計決策。但是,我沒有想到下面的代碼會導致此錯誤:泛型和「二元運算符的參數之一必須是包含類型」錯誤

public class Exp<T> 
{ 
    public static Exp<int> operator +(Exp<int> first, Exp<int> second) 
    { 
     return null; 
    } 
} 

此運算符的問題是什麼?爲什麼這種情況屬於c#的運算符重載限制?允許這種聲明是危險的嗎?

回答

5

因爲包含類型是Exp<T>而不是Exp<int>。你在這裏要做的是專業化的a la C++,這在C#中是不可能的。

+0

所以這裏的問題不是操作數與包含類型無關,這可能是危險的,但它不允許有「專業化」? – nakhli

+0

是的。你正在做的事情看起來完全像C++ *模板特化*,這在C#中是不可能的。看看[這個](http://stackoverflow.com/questions/600978/how-to-do-template-specialization-in-c)。 –

3

您屬於Exp<T>類型的類,運算符中的這兩個參數都不是Exp<T>,它們都是Exp<int>

閱讀this article建議的解決方法。

+0

我知道類型是不同的。如果他們不相關,我知道這可能是危險的。但在這裏,它看起來更像是一種仿製藥的限制,而不是設計的安全防護。 感謝您的建議文章! – nakhli

相關問題