我可以使用+运算符的通用约束吗?
是否有一些“where”类型的约束可以添加以使下面的代码编译?
public class Plus : BinaryOperator where T : ... { public override T Evaluate(IContext context) { return left.Evaluate(context) + right.Evaluate(context); } }
谢谢 :)
C#中没有这样的设备。 但是有一些选择:
- 在C#4.0和.NET 4.0(或更高版本)中,使用
dynamic
,它支持+
但不提供编译时检查 - 在.NET 3.5(或更高版本)中, MiscUtil提供了一个
Operator
类,它使运算符可用作方法 – 再次,没有任何编译时检查
所以要么:
return (dynamic)left.Evaluate(context) + (dynamic)right.Evaluate(context);
要么
return Operator.Add(left.Evaluate(context), right.Evaluate(context));
C#中的Type参数约束非常有限, 在此处列出 。 所以答案是编译时检查没有。 如果T是您创建和管理的类型,那么可以采用一种方法
interface IAddable { IAddable Add(IAddable foo); }
并为所有类型实现IFoo,并使用where T: IAddable
作为约束并使用Add()
而不是+
使用通用约束可以强制T
- 作为引用类型或值类型
- inheritance某个class级
- 实现某些接口
- 拥有无参数构造函数
但就是这样。 你不能强制存在静态operator+
。