Статические и экземпляры с тем же именем?
У меня есть класс с статическим и нестационарным интерфейсом в С#. Возможно ли иметь статический и нестатический метод в классе с тем же именем и сигнатурой?
Я получаю ошибку компилятора, когда пытаюсь это сделать, но почему-то я думал, что есть способ сделать это. Я ошибаюсь или нет способа иметь как статические, так и нестатические методы в одном классе?
Если это невозможно, есть ли хороший способ реализовать нечто подобное, которое может быть применено в общем случае к любой ситуации?
ИЗМЕНИТЬ
Из полученных мной ответов ясно, что нет никакого способа сделать это. Я собираюсь с другой системой именования, чтобы обойти эту проблему.
Ответы
Ответ 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.
Адриан