public interface Foo<TBar>
where TBar : (can use the '+' and '-' operators)
謝謝。
public interface Foo<TBar>
where TBar : (can use the '+' and '-' operators)
謝謝。
您可以創建一個類型Foo
,重載這兩個運算符,然後將它的泛型類型限制爲它。然而,你不能限制你的通用參數,要求任何類型的任意類型在特定的基礎上重載這些操作符。
可以重載運營商:
public static TBar operator +(TBar c1, TBar c2)
{
return ... // do the math
}
好的,你想超載的東西,不知道有這樣的屬性。返回c1 + c2? – 2012-12-01 15:35:52
Yes和No.泛型參數只能被限制在
new()
)這些對於+
和-
運算符有用的唯一一個是基類型。因此,如果基本類型包含這些運算符,則可以限制您的TBar
也可以實現它們。
但是這在一般意義上不起作用。無論您選擇哪種基本類型,它都無法與+
和-
最常用的類型配合使用。即int
,double
,string
等等,因爲它們從ValueType
繼承,它沒有這個限制
不,這是不可能的。
在理論上,您可以將TBar約束爲實現這些運算符的類型,但運算符是靜態的,它們不會被繼承。
這意味着你會有效地限制你的類型爲只有的基本類型,在這種情況下,你可以完全放棄泛型。
不,你不能限制你的TBar泛型參數是「任何實現這些操作符的類型」,它只是在語言中不可用。
試圖理解,你是說你不能將泛型類型約束爲實現操作符的類型?這與「Interface IRepository其中T:ModelBase」有什麼不同? –
hometoast
2011-04-01 17:04:01
@hometoast,您當然可以這麼做 - 您可以將類型參數限制爲重載這些操作符的* specific *類型。我的觀點是,OP似乎想要將類型限制爲** any **類型,所以* long *,因爲它重載了這些運算符。我強調後者是不可能的。 – 2011-04-01 17:06:36
有道理。將泛型類型約束爲double,float,int等(即可以使用'+'和' - '但不超載它們的值類型')。我想你不能將泛型類型約束爲值類型。 – ken 2011-04-01 20:04:18