【发布时间】:2011-07-27 20:25:49
【问题描述】:
这可能吗?
public interface Foo<TBar>
where TBar : (can use the '+' and '-' operators)
谢谢。
【问题讨论】:
这可能吗?
public interface Foo<TBar>
where TBar : (can use the '+' and '-' operators)
谢谢。
【问题讨论】:
不,这是不可能的。
理论上,您可以将 TBar 约束为实现这些运算符的类型,但运算符是静态的,它们不是继承的。
这意味着您将有效地将您的类型限制为仅基本类型,在这种情况下,您可以完全放弃泛型。
不,您不能将 TBar 泛型参数限制为“实现这些运算符的任何类型”,它只是在该语言中不可用。
【讨论】:
是和否。泛型参数只能被限制为
new())其中唯一对+ 和- 运算符有用的是基类型。因此,如果基本类型包含这些运算符,您可以约束 TBar 来实现它们。
但是这在一般意义上是行不通的。无论您选择哪种基本类型,它都无法与+ 和- 最常用的类型一起使用。即int、double、string 等...因为它们继承自没有此约束的ValueType
【讨论】:
您可以重载运算符:
public static TBar operator +(TBar c1, TBar c2)
{
return ... // do the math
}
【讨论】:
您可以创建一个类型Foo 来重载这两个运算符,然后将您的泛型类型约束到它。但是,您不能将泛型参数限制为要求任何任意类型临时重载此类运算符。
【讨论】:
Interface IRepository<T> where T : ModelBase 有何不同?
class、new() 和 struct。但是,使用 struct 您可以将其限制为 all 值类型——但由于某些值类型不会重载这些运算符,因此您将无法使用 + 和 - 运算符TBar 类型的值。