【问题标题】:Is it true that for all .NET operator overload methods must be public and static?对于所有 .NET 运算符重载方法是否必须是公共的和静态的,这是真的吗?
【发布时间】:2013-07-11 13:49:39
【问题描述】:

引用自 C# 来自 CLR

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

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

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

【问题讨论】:

  • 在 ECMA-335 第 I.10.3.1 和 3.2 章中肯定提到过:`它们在类中表示为静态方法`
  • @HansPassant Thx,找到了!

标签: operator-overloading clr cls-compliant


【解决方案1】:

看起来它真的不需要公开,但是在执行时使其非静态是有问题的。我从以下代码开始进行实验:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2015-03-26
    • 2012-10-02
    • 2017-07-20
    相关资源
    最近更新 更多