【发布时间】: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