【问题标题】:Method overload static + Dynamic fails方法重载静态+动态失败
【发布时间】:2012-09-12 08:53:40
【问题描述】:

上周我多次遇到此问题,很想知道原因 - 我有一个谷歌,但找不到任何直接相关的内容。

我有一个带有动态方法的类,我可以添加一个具有相同接口的静态方法:

public class MyClass
{
    public int MyMethod()
    {
        //do something #1;
    }

    public static int MyMethod()
    {
        //do something
    }
}

这很好,但是如果我尝试从动态方法调用静态方法,将 #1 替换为 return MyClass.MyMethod(),我会收到错误“以下方法或属性之间的调用不明确:MyClass.MyMethod()和 MyClass.MyMethod()。
如果删除静态方法,则错误变为“需要对象引用..”,这是有道理的。

那么为什么这会模棱两可呢?它以类名开头以指定静态方法,该方法适用于代码中的任何其他位置。
为什么不在这里?

编辑:我实际上并没有尝试在没有调用静态方法的动态方法的情况下编译它,我只是通过 VS 没有下划线。
但我想仍然是一个类似的问题,但添加了“为什么不能两者都有,因为一个是静态的,一个不是”

【问题讨论】:

  • 给定的代码是为你编译的吗?它为我抛出错误 CS0111(已经定义了一个名为 'MyMethod' 的成员具有相同的参数类型)。
  • 这是一个奇怪(不正确)的错误消息,但可能只是因为编译器尝试解析和验证引用的顺序。
  • @prashanth 你是对的。我做了一个假设 - 请参阅编辑。
  • 顺便说一句,他们不称这些“动态”方法。 :)

标签: c# overloading


【解决方案1】:

这里还有一个similar question on SO,给出了一些解释,为什么你不能有两个具有相同签名的方法。

public class MyClass
{
    public int MyMethod()
    {
        return 0;
    }

    public static int MyMethod() //Here compiler says, that you've already got method MyMethod with same parameter list
    {
        return 0;
    }
}

所以,你根本不能拥有这些方法

看看this

起初:

方法的签名由方法名和方法名组成 每个形式的类型和种类(值、引用或输出) 参数,按从左到右的顺序考虑。一个签名 方法具体不包括返回类型,也不包括 包括可以为最右边指定的 params 修饰符 参数。

其次:

方法的重载允许类、结构或接口 声明多个具有相同名称的方法,提供它们的签名 在该类、结构或接口中是唯一的。

编辑

至于你得到这个错误的原因:你可能还没有编译并且看到一个带有红色下划线的错误。如果您进行编译,您将看到带有蓝色下划线的错误不是在您调用静态方法的行,而是在定义静态方法的行。

【讨论】:

【解决方案2】:

那么为什么这会模棱两可呢?它以类名开头 指定静态方法,该方法适用于代码中的任何其他位置。为什么 不在?

之所以模棱两可,是因为您可以在 MyClass 上拥有一个名为 MyClass 的实例属性。我相信 Eric Lippert 更详细地描述了这个推理。我找不到那个具体的帖子,但是here is a similar series from him

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2020-01-18
    • 2019-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多