首页>Program>source

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

当我尝试执行此操作时遇到编译器错误,但是由于某种原因,我认为有一种方法可以执行此操作.我是错误的还是没有办法在同一个类中同时使用静态和非静态方法?

如果这不可能,是否有一种很好的方法来实现可普遍应用于任何情况的类似内容?

EDIT
从我收到的答复来看,显然没有办法做到这一点.我要使用其他命名系统来解决此问题。

最新回答
  • 2021-1-11
    1 #

    不,您不能.进行限制的原因是,也可以从非静态上下文中调用静态方法,而无需添加类名(因此,可以使用MyStaticMethod()代替MyClass.MyStaticMethod()).如果两者兼有,编译器将无法确定您要查找的内容.

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

  • 2021-1-11
    2 #

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

    interface IFoo
    {
        void Bar();
    }
    class Foo : IFoo
    {
        static void Bar()
        {
        }
        void IFoo.Bar()
        {
            Bar();
        }
    }
    

    有时在为P / Invoke调用创建包装类时会遇到这种情况。

  • 2021-1-11
    3 #

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

    class Foo
    {
        static void Bar()
        {
        }
        void Fizz()
        {
            Bar();
        }
    }
    

    ...因此,不允许您使用具有相同签名的静态方法和实例方法是有道理的。

    您要完成什么? 在不了解具体细节的情况下很难提出解决方法.我只是重命名其中一种方法。

  • 2021-1-11
    4 #

    C#的设计不完善...

    虽然确实需要全局变量或非全局变量,但默认情况下它应该选择一个,如果想要另一个,则只需对其进行更多限定。

    class Logger {
       public static Logger instance;
       public static void Log(string message) {
           instance.Log(message); // currently the compiler thinks this is ambiguous, but really its not at all.  Clearly we want the non-static method
       }
       public void Log(string message) {
       }
       public void DoStuff() {
          Log("doing instance stuff"); // this could be ambiguous, but in my opinion it should default to a call to this.Log()
          Logger.Log("doing global stuff"); // if you want the global qualify it explicitly
       }
    }
    

  • 2021-1-11
    5 #

    可以使用具有相同名称的静态方法和实例方法,只要它们的声明在参数的数量或类型上有所不同即可.关于如何在一个类中拥有两个具有相同名称的实例方法,这是相同的规则。

    尽管从技术上讲,在静态方法与实例方法的情况下,它们已经因实例方法中隐式this参数的存在而有所不同,但这种差异不足以使编译器确定要调用的是哪两个方法

    Update : 我犯了一个错误.返回值不足以具有不同的签名。

  • java:Android Studio TransformException:错误:任务':app:transformClasseswithDexForDebug'的执行失败
  • http:通过Javascript将cookie设置为HttpOnly