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