C# - 接口不能包含运算符

时间:2015-11-26 20:17:57

标签: c# .net interface operator-overloading

问题:C#接口可以包含运营商吗?

通过搜索,我找到的答案是没有。 例如,C# interface cannot contain operators

然而,在Andrew Troelsen的书" Pro C#5.0和.Net 4.5框架"他发表以下声明

  

唉,当前版本的C#不支持运算符约束。但是,这是可能的   (虽然它需要更多的工作)通过定义支持的接口来实现期望的效果   这些运算符( C#接口可以定义运算符!)然后指定的接口约束   泛类。

粗体句是令我困惑的。的确,当我尝试以下

using System;

interface MathOps<T> where T : class
{
    static T operator+(T a, T b);
}

class MyClass : MathOps<MyClass>
{
    int x;

    public MyClass(int n = 0)
    {
        x = n;
    }

    public static MyClass operator+(MyClass a, MyClass b)
    {
        return new MyClass(a.x + b.x);
    }
}

class Program
{
    static void Add<T>(ref T a, ref T b) where T : class, MathOps<T>
    {
        return a + b;
    }

    static void Main(string[] args)
    {

    }
}

编译器向我发送了以下内容

error CS0567: Interfaces cannot contain operators

所以案件有点似乎已经解决了。但为什么Troelsen先生会这样写?我错过/误解了什么吗?

感谢。

1 个答案:

答案 0 :(得分:0)

要记住的一个关键是,据我所知,并不是说接口不能定义运算符(尽管这是真的)但接口不能定义静态,这既令人沮丧又合乎逻辑。