Почему 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 иногда ошибается. Но не обычно. Поэтому я хотел бы знать, что он здесь думает.
Любые идеи?
Ответы
Ответ 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
Внутренние классы могут обращаться к статическим методам внешнего класса и, следовательно, возникнет конфликт имен.