2012-01-18 24 views
23

考虑下面的代码:为什么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.SomeValueSuper.Inner.SomeValue)。而且(据我所知),你不能用一个引用来表示另一个变量。

我发现Resharper有时候是错的。但通常不会。所以我想知道它在这里想什么。

任何想法?

+2

我认为这是相当称为嵌套类不是子类,这是更与派生类相关;-) – Seb 2012-01-18 16:51:20

+0

@Seb - 好点。我改变了标题。 – Vaccano 2012-01-18 16:53:32

回答

27

我在猜测,因为这意味着在内部类中使用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

+0

为什么选择投票? – Joey 2012-01-18 16:54:58

+0

它不会阻止您访问它,但您必须限定参考; var someValue = Super.SomeValue; – 2012-01-18 16:58:19

+0

是的,不好的选择会改变它。 – Joey 2012-01-18 16:59:56

2

看起来他们有固定的,但尚未公布的固定编译:http://youtrack.jetbrains.net/issue/RSRP-277343#tab=History

编辑

由于nulltoken指出,上面的链接是一个稍微不同的情景,我们有一个枚举不字符串和成员不是静态的,所以它可能不适用。

而且,它隐藏从内外侧,你现在需要有资格的参考Inner.SomeValue刚刚SomeValue会给你默认内,因此恕我直言这不是这么糟糕的警告。

+0

我可能是错的,但我认为你指向的问题处理一个稍微不同的主题:一个枚举在父类中声明,然后在嵌套类中使用。 – nulltoken 2012-01-18 16:56:02

+0

@nulltoken,你是对的,这是一个枚举不是一个字符串,成员不是静态的,所以它不一定适用。 – 2012-01-18 17:01:04

相关问题