Подтвердить что ты не робот

Статические и экземпляры с тем же именем?

У меня есть класс с статическим и нестационарным интерфейсом в С#. Возможно ли иметь статический и нестатический метод в классе с тем же именем и сигнатурой?

Я получаю ошибку компилятора, когда пытаюсь это сделать, но почему-то я думал, что есть способ сделать это. Я ошибаюсь или нет способа иметь как статические, так и нестатические методы в одном классе?

Если это невозможно, есть ли хороший способ реализовать нечто подобное, которое может быть применено в общем случае к любой ситуации?

ИЗМЕНИТЬ
Из полученных мной ответов ясно, что нет никакого способа сделать это. Я собираюсь с другой системой именования, чтобы обойти эту проблему.

4b9b3361

Ответ 1

Нет, вы не можете. Причина ограничения заключается в том, что статические методы также можно вызывать из нестатических контекстов без необходимости добавлять имя класса (так что MyStaticMethod() вместо MyClass.MyStaticMethod()). Компилятор не может сказать, что вы ищете, если у вас есть оба.

У вас могут быть статические и нестатические методы с тем же именем, но разные параметры, соответствующие тем же правилам, что и перегрузка метода, просто не могут иметь точно такую ​​же подпись.

Ответ 2

На самом деле, это способ сделать это, явно реализуя интерфейс. Это не идеальное решение, но в некоторых случаях оно может работать.

interface IFoo
{
    void Bar();
}

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

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

Иногда я сталкиваюсь с этой ситуацией, когда создаю классы-оболочки для вызовов P/Invoke.

Ответ 3

Вы можете вызвать статические методы из методов экземпляра без указания имени типа:

class Foo
{
    static void Bar()
    {
    }

    void Fizz()
    {
        Bar();
    }
}

... поэтому имеет смысл, что вам не будет разрешено иметь статический метод и метод экземпляра с одной и той же сигнатурой.

Чего вы пытаетесь достичь? Трудно предложить обходной путь, не зная специфики. Я бы просто переименовал один из методов.

Ответ 4

С# не хорошо спроектирован, когда дело доходит до этого...

Хотя верно, что вы можете хотеть глобальный или неглобальный, он должен выбрать один по умолчанию, а если вы хотите другого, тогда вы просто получите его больше.

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
   }
}

Ответ 5

У вас может быть статический и экземплярный метод с тем же именем, если их объявление отличается количеством или типом параметров. Это то же правило о том, как вы можете иметь два метода экземпляра с тем же именем в классе.

Хотя технически, в случае статического метода против экземпляра они уже отличаются наличием неявного этого параметра в методе экземпляра, этой разницы недостаточно для компилятора, чтобы определить, какой из двух вы хотите вызвать.

Обновить. Я допустил ошибку. Возвращаемых значений недостаточно, чтобы иметь различную подпись.

Ответ 6

OK. Корень этой проблемы состоит в том, что С# не должен позволять вам вызывать статический метод из метода экземпляра без указания имени типа.

Другие полные языки OO (например, Smalltalk) не позволяют этого, а также просто путают людей, которые понимают объекты. Разделение между стороной экземпляра и классом (или статикой) очень важно и наличие языка, который способствует путанице в этих деталях, - это........ не хорошая идея... но типичная для типа, которую мы ожидаем от MS.

Адриан