引自C#来自CLR
CLR规范要求运算符重载方法 公共和静态方法。
我检查了ECMA-335,但无法找到任何证据。
到目前为止,我知道C#和F#都是如此。所有符合CLS的语言都适用吗?
答案 0 :(得分:4)
看起来它不是真的需要公开,但是在执行时将其设为非静态是有问题的。我从这段代码开始实验:
using System;
class Oddity
{
public static Oddity operator+(Oddity x, Oddity y)
{
Console.WriteLine("Adding oddities");
return null;
}
}
class Test
{
static void Main()
{
var x = new Oddity();
var y = new Oddity();
var z = x + y;
}
}
...然后通过ildasm
运行,更改内容,然后使用ilasm
并运行结果。
assembly
(相当于internal
):一切都很好将辅助功能修改器更改为private
:它组装了(这让我感到惊讶)但在执行时失败了:
未处理的异常:System.MethodAccessException:尝试通过方法'Test.Main()'访问方法'Oddity.op_Addition(Oddity,Oddity)'失败。
在Test.Main()
删除static
部分:它已组装(再次,令我感到惊讶)但在执行时失败:
未处理的异常:System.MissingMethodException:找不到方法:'Oddity Oddity.op_Addition(Oddity,Oddity)'。
在Test.Main()
我怀疑这些应该在汇编时被捕获,但由于语言只是期望来生成公共和静态的运算符,验证器有点松懈。