引用自 C# 来自 CLR
CLR 规范要求运算符重载方法是公共方法和静态方法。
我检查了 ECMA-335,但找不到任何证据。
到目前为止,我知道 C# 和 F# 是这样。所有符合 CLS 的语言都是这样吗?
引用自 C# 来自 CLR
CLR 规范要求运算符重载方法是公共方法和静态方法。
我检查了 ECMA-335,但找不到任何证据。
到目前为止,我知道 C# 和 F# 是这样。所有符合 CLS 的语言都是这样吗?
看起来它并不是真的需要公开,但是在执行时使其非静态是有问题的。我从以下代码开始进行实验:
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()
我怀疑这些确实应该在汇编时被捕获,但由于语言只希望产生公共和静态的运算符,因此验证器有点松懈。