对于所有.NET运算符,重载方法必须是公共的还是静态的?

时间:2013-07-11 13:49:40

标签: operator-overloading clr cls-compliant

引自C#来自CLR

  

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

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

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

1 个答案:

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

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