Вопрос

Я получаю следующее предупреждение компилятора:

'Resources.Foo.GetType()' hides inherited member 'object.GetType()'. Use the new keyword if hiding was intended.    Resources.NET\Resources\Class1.cs   123 20  Resources

для этого (очень упрощенного) кода:

public interface IFoo
{
    int GetType();
    string GetDisplayName();
}

public class Foo : IFoo
{
    public int GetType() { return 3; }   *** Warning: points to here (line 123)***
    public string GetDisplayName() { return "Foo"; }
}

Обратите внимание, чего я не понимаю, так это почему функция getDisplayName() НЕ получает предупреждение.Я явно что-то упускаю из виду.

Я покопался в Stack Overflow и погуглил эту ошибку, и, похоже, она применима к наследованию классов, а не к интерфейсам.Я действительно сбит с толку, почему это было бы запущено для интерфейса (который определяет свои методы как виртуальные).

Заранее спасибо за понимание.

Это было полезно?

Решение

В Полученный тип метод определяется на Система.Объект класс, который является конечным базовым классом из всех классов Фреймворка.

Этот метод используется для получения Тип текущего экземпляра во время выполнения, и я думаю, что вы не собираетесь переопределять его (у вас есть возвращаемый тип int).

Я предлагаю вам переименовать метод в GetFooType или что-то еще, или реализовать свой интерфейс явно чтобы избежать проблем во время выполнения.

Другие советы

Это относится к вашему методу скрытия GetType из объекта, а не из вашего интерфейса.Поскольку ваш класс наследует object и реализует IFoo, и оба обеспечивают GetType способ, посредством неявно реализуя интерфейс, вы скроете GetType унаследованный от объекта.Если вы все еще хотите, чтобы был вызван ваш интерфейсный метод GetType, вы можете реализовать это явно вместо этого в Foo:

int IFoo.GetType()
{
    return 3;
}

Все типы в .NET являются производными от System.Object.

Система.Объект уже определяет метод с именем GetType.Если вы определяете другой метод 'GetType' в своем классе, и если кто-то создает объект вашего класса, он никогда не сможет вызвать метод GetType, доступный System.Object.Именно по этой причине вы получаете предупреждение о том, что 'GetType' скрывает метод, определенный в System.Object.Вы не получаете это предупреждение для getDisplayName, потому что System.Объект (или, если на то пошло, любой родительский класс) не определяет этот метод.

Я бы порекомендовал вам изменить имя вашего метода на что-нибудь другое, как обычно .Разработчики NET ожидают, что вызов метода GetType будет ссылаться на System.Реализация объекта.

Это не жалобы на вашу реализацию интерфейса, а скорее на вашу повторную реализацию GetType(), которая уже есть в "object", от которого Foo автоматически наследует."Object" не имеет метода getDisplayName и поэтому не вызывает нареканий по этому поводу.Попробуйте переименовать метод или добавить модификатор "new", если вы действительно хотите скрыть объект.GetType() хотя это и не рекомендуется.

System.Класс Object уже имеет метод GetType()

вы должны использовать ключевое слово new или override для решения этой проблемы

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top