当前位置:  开发笔记 > 编程语言 > 正文

具有相同名称的静态和实例方法?

如何解决《具有相同名称的静态和实例方法?》经验,为你挑选了3个好方法。

我在C#中有一个同时具有静态和非静态接口的类.是否可以在具有相同名称和签名的类中使用静态和非静态方法?

当我尝试这样做时,我遇到编译器错误,但出于某种原因,我认为有一种方法可以做到这一点.我错了还是没有办法在同一个类中同时使用静态和非静态方法?

如果这是不可能的,有没有一种很好的方法来实现这样的东西,可以适用于任何情况?

编辑
从我收到的回复来看,很明显没有办法做到这一点.我将使用不同的命名系统来解决这个问题.



1> ckramer..:

不,你不能.限制的原因是静态方法也可以从非静态上下文调用,而不需要预先添加类名(因此MyStaticMethod()而不是MyClass.MyStaticMethod()).如果你有两个,编译器无法分辨你正在寻找哪个.

您可以使用具有相同名称的静态和非静态方法,但遵循与方法重载相同的规则的不同参数,它们不能具有完全相同的签名.


我发现这个答案的逻辑存在缺陷.我认为没有理由为什么C#不能通过要求"这个"来消除歧义.令牌在这种情况下调用实例方法.另外,andasa显示静态和实例方法可以具有相同名称的方式.
没错,他们可能会进行某种类型的检查,如果发生碰撞,默认情况下会选择静态方法,并且需要这样做.用于访问实例方法.当然,在处理静态属性时会变得很棘手,因为在方法范围内,如果您的参数被命名为与静态/实例属性之一相同,那么您必须使用类名来指定静态版本,这指定实例版本,如果没有,请访问该参数.听起来像是一个很难找到很多错误的好方法.
我认为默认情况下应该从非静态方法调用非静态方法.如果你想要全局,那么你应该通过在类名前加前缀来要求它.

2> 小智..:

实际上,有一种方法可以通过显式实现接口来实现这一目的.它不是一个完美的解决方案,但它可以在某些情况下工作.

interface IFoo
{
    void Bar();
}

class Foo : IFoo
{
    static void Bar()
    {
    }

    void IFoo.Bar()
    {
        Bar();
    }
}

当我为P/Invoke调用创建包装类时,我有时遇到这种情况.



3> Matt Hamilto..:

您可以从实例方法调用静态方法,而无需指定类型名称:

class Foo
{
    static void Bar()
    {
    }

    void Fizz()
    {
        Bar();
    }
}

...因此,不允许您拥有静态方法和具有相同签名的实例方法.

你想达到什么目的?如果不了解具体细节,很难提出解决方法.我只是重命名其中一种方法.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有