【问题标题】:C# - interfaces cannot contain operatorsC# - 接口不能包含运算符
【发布时间】:2016-03-01 00:11:03
【问题描述】:

问题:C#接口可以包含操作符吗?

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

然而,在 Andrew Troelsen 的《Pro C# 5.0 and the .Net 4.5 framework》一书中,他做了如下声明

唉,当前版本的 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

所以这个案子似乎已经解决了。但为什么特罗尔森先生会这样写呢?我是否遗漏/误解了什么?

谢谢。

【问题讨论】:

  • 接口不能包含静态方法。并不是说删除 static 关键字可以让您到达任何地方。请注意,像这样的书籍往往会受到不良编辑的影响,它可能在 .NET 1.x 中是可能的。 CLR 并不关心接口是否有操作符,它只是一个名字很有趣的方法。可能出现的一个小提示是,我使用的 MSDN 的脱机副本在索引中没有 CS0567。你在这上面浪费时间。
  • @HansPassant 谢谢,是的,我同意你的观点,这本书看起来需要更多的编辑。这个我就不多花心思了,接口不能包含操作符,句号。

标签: c# .net interface operator-overloading


【解决方案1】:

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

【讨论】:

  • 我很好奇为什么投反对票?我并不反对,但是没有评论的反对票并不能帮助我学习任何东西。 :) 而且,我认为我说的是真的。
  • 这在 C# 8 中明显改变了。接口现在可以定义静态方法,但仍然不能定义 operators
猜你喜欢
  • 2011-01-03
  • 2011-09-30
  • 1970-01-01
  • 2011-01-08
  • 2017-02-05
  • 1970-01-01
相关资源
最近更新 更多