0

引用自 C# 来自 CLR

CLR 规范要求运算符重载方法是公共方法和静态方法。

我检查了 ECMA-335,但找不到任何证据。

到目前为止,我知道 C# 和 F# 是这样。所有符合 CLS 的语言都是这样吗?

4

1 回答 1

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()

我怀疑这些确实应该在汇编时被捕获,但由于语言只希望产生公共和静态的运算符,因此验证器有点松懈。

于 2013-07-11T13:58:19.033 回答