2011-04-01 25 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泛型参数是“任何实现这些操作符的类型”,它只是在语言中不可用。