方法过载静态+动态失败

时间:2012-09-20 01:31:38

标签: c# overloading

我在上周遇到过好几次,我很想知道原因 - 我有一个谷歌,但找不到任何直接相关的东西。

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

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

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

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

那为什么这个含糊不清?它已经以类名开头,用于指定静态方法,该方法可以在代码中的任何其他位置使用 为什么不在这里?

编辑:如果没有动态方法调用静态方法,我实际上没有尝试编译它,我刚刚通过VS而不是强调它。
但我认为仍然是一个类似的问题但添加了“为什么不能同时存在,因为一个是静态的,一个不是”

2 个答案:

答案 0 :(得分: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修饰符   参数。

其次:

  

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

修改

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

答案 1 :(得分:0)

  

那为什么这个含糊不清?它已经以类名开头   指定静态方法,该方法适用于代码中的任何其他位置。为什么   不在这里?

它不明确的原因是因为你可以在MyClass上有一个名为MyClass的实例属性。我相信Eric Lippert更详细地描述了推理。我找不到具体的帖子,但here is a similar series from him