2012-01-18 2 views
23

Dato il seguente codice:Perché Resharper pensa che una classe interna con la proprietà "SomeValue" nasconda una proprietà con lo stesso nome nella classe esterna?

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

    public static string SomeValue { get; set; } 
} 

ReSharper mi dice che Super.Inner.SomeValue nasconde una proprietà dalla classe esterna.

Come ci si nasconde? Hai due riferimenti distinti (Super.SomeValue e Super.Inner.SomeValue). E (per quanto ne so) non puoi usare un riferimento per significare l'altra variabile.

Ho trovato che Resharper è a volte sbagliato. Ma non di solito. Quindi mi piacerebbe sapere cosa sta pensando qui.

Qualsiasi idea?

+2

Penso che sia piuttosto chiama una classe annidata di sottoclasse, che è più rilevante per una classe derivata ;-) – Seb

+0

@Seb - buon punto. Ho cambiato il titolo. – Vaccano

risposta

27

Sto supponendo perché significa utilizzare SomeValue nella classe interna significa che si ottiene il valore assegnato alla classe interna anziché alla classe esterna.

Considerate questo:

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"; }} 
} 

Attualmente Super.Sub.OtherValue tornerà Inner ma togliendo la linea che ho commentato lo farà per tornare Outer

+0

Perché il voto negativo? – Joey

+0

Non ti impedisce di accedervi, ma devi qualificare il riferimento; var someValue = Super.SomeValue; –

+0

Sì, la scelta sbagliata delle parole, lo cambierà. – Joey

2

sembra che hanno risolto, ma devono ancora rilasciare la build fisso: http://youtrack.jetbrains.net/issue/RSRP-277343#tab=History

EDIT

Come nulltoken ha sottolineato, il link qui sopra è uno scenario leggermente diverso dove abbiamo un enum non un stringa e i membri non sono statici, quindi potrebbe non essere applicabile.

Inoltre, nasconde l'esterno dall'interno, come ora è necessario qualificare un riferimento Inner.SomeValue come solo SomeValue ti darà l'interno di default, quindi IMHO non è un avvertimento così cattivo.

+0

Potrei sbagliarmi, ma penso che la questione che tu punti abbia a che fare con un argomento leggermente diverso: Un Enum è dichiarato nella classe genitore, quindi usato nella classe annidata. – nulltoken

+0

@nulltoken, hai ragione, questo è un enum non una stringa ei membri non sono statici, quindi non si applica necessariamente. –