在接口级别定义运算符

时间:2014-01-11 22:38:31

标签: c# .net-4.0 operator-overloading

我有一系列我想支持执行数学运算的类。让我们说它看起来像这样:

public interface IWrapValueBase 
{
    public int aValue { get; set; }
}
public abstract WrapValueBase : IWrapValueBase
{
    public int aValue { get; set; }
    //...
}
public WrapValue : WrapValueBase 
{
    //...
}

我想创建一些运算符,以便我可以使用任何实现此接口的操作。例如:

public static WrapValue operator +(IWrapValueBase first, IWrapValueBase second)
{
    return new WrapValue(} { aValue = first.aValue + second.aValue };
}

所以我想要一个允许使用+运算符将任何IWrapValueBases加在一起的运算符,并返回一个新的WrapValue实例。即:

List<IWrapValueBase> myList = new List<IWrapValueBase>();
myList.Add(new WrapValue() { aValue = 1 });
myList.Add(new WrapValue() { aValue = 2 });

WrapValue result = new WrapValue() { aValue = 0 };
foreach(IWrapValueBase val in myList)
    result = result + val;
Assert.Equal(result.aValue, 3);

有没有办法做到这一点?或者,我是否必须在WrapValueBase类中定义运算符,并将IWrapValueBase引用转换为WrapValueBase

我的解决方案的问题是,它需要IWrapValueBase类的每个实现者拥有它自己的运算符定义,因为我们知道接口具有aValue属性,所以我们应该总是可以将两个实现接口的实例加在一起,无论它们的类型是什么。

1 个答案:

答案 0 :(得分:1)

来自语言规范§20.2接口成员

  

接口不能包含常量,字段,运算符,实例   构造函数,终结符或类型,接口也不能包含   任何形式的静态成员。

你也不能:

  • 使用扩展方法实现运算符
  • 使用从接口到实现运算符
  • 的隐式转换

您似乎不是使用运算符而是使用方法“添加”,或者在基类中实现它。你真的有多个IWrapValueBase实现者吗?