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

Почему Resharper считает, что внутренний класс с свойством "SomeValue" скрывает свойство с тем же именем во внешнем классе?

С учетом следующего кода:

public static class Super
{
    public static class Inner
    {
        public static string SomeValue { get; set; }
    }

    public static string SomeValue { get; set; }
}

Resharper сообщает мне, что Super.Inner.SomeValue скрывает свойство из внешнего класса.

Как происходит скрытие? У вас есть две разные ссылки (Super.SomeValue и Super.Inner.SomeValue). И (насколько я знаю) вы не можете использовать одну ссылку для обозначения другой переменной.

Я обнаружил, что Resharper иногда ошибается. Но не обычно. Поэтому я хотел бы знать, что он здесь думает.

Любые идеи?

4b9b3361

Ответ 1

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

Рассмотрим это:

public static class Super
{
  public static class Sub
  {
    public static string OtherValue {get{return SomeValue;}}

    // Remove this line and OtherValue will return Outer
    public static string SomeValue { get{return "Inner"; }}
  }

  public static string SomeValue { get{return "Outer"; }}
}

В настоящее время Super.Sub.OtherValue вернет Inner, но удаление строки, которую я прокомментировал, приведет к возврату Outer

Ответ 2

Похоже, они исправили его, но еще не выпустили исправленную сборку: http://youtrack.jetbrains.net/issue/RSRP-277343#tab=History

ИЗМЕНИТЬ

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

Кроме того, он скрывает внешний от внутреннего, поскольку теперь вам нужно квалифицировать ссылку Inner.SomeValue, поскольку только SomeValue предоставит вам внутреннее значение по умолчанию, поэтому ИМХО это не такое плохое предупреждение.

Ответ 3

Внутренние классы могут обращаться к статическим методам внешнего класса и, следовательно, возникнет конфликт имен.