2011-04-01 53 views

回答

6

您可以創建一個類型Foo,重載這兩個運算符,然後將它的泛型類型限制爲它。然而,你不能限制你的通用參數,要求任何類型的任意類型在特定的基礎上重載這些操作符。

+0

試圖理解,你是說你不能將泛型類型約束爲實現操作符的類型?這與「Interface IRepository 其中T:ModelBase」有什麼不同? – hometoast 2011-04-01 17:04:01

+1

@hometoast,您當然可以這麼做 - 您可以將類型參數限制爲重載這些操作符的* specific *類型。我的觀點是,OP似乎想要將類型限制爲** any **類型,所以* long *,因爲它重載了這些運算符。我強調後者是不可能的。 – 2011-04-01 17:06:36

+0

有道理。將泛型類型約束爲double,float,int等(即可以使用'+'和' - '但不超載它們的值類型')。我想你不能將泛型類型約束爲值類型。 – ken 2011-04-01 20:04:18

2

可以重載運營商:

public static TBar operator +(TBar c1, TBar c2) 
{ 
    return ... // do the math 
} 
+1

好的,你想超載的東西,不知道有這樣的屬性。返回c1 + c2? – 2012-12-01 15:35:52

4

Yes和No.泛型參數只能被限制在

  • 實現一個inerface
  • 可訪問的無參數構造函數(new()
  • 有一個特定的基類型
  • 是一個結構/類

這些對於+-運算符有用的唯一一個是基類型。因此,如果基本類型包含這些運算符,則可以限制您的TBar也可以實現它們。

但是這在一般意義上不起作用。無論您選擇哪種基本類型,它都無法與+-最常用的類型配合使用。即int,double,string等等,因爲它們從ValueType繼承,它沒有這個限制

2

不,這是不可能的。

在理論上,您可以將TBar約束爲實現這些運算符的類型,但運算符是靜態的,它們不會被繼承。

這意味着你會有效地限制你的類型爲只有的基本類型,在這種情況下,你可以完全放棄泛型。

不,你不能限制你的TBar泛型參數是「任何實現這些操作符的類型」,它只是在語言中不可用。