2012-01-18 14 views
23

Dado el siguiente código:¿Por qué Resharper cree que una clase interna con la propiedad "SomeValue" oculta una propiedad con el mismo nombre en la clase externa?

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

    public static string SomeValue { get; set; } 
} 

ReSharper me dice que Super.Inner.SomeValue esconde una propiedad de la clase externa.

¿Cómo se esconde? Usted tiene dos referencias distintas (Super.SomeValue y Super.Inner.SomeValue). Y (hasta donde yo sé) no puede usar una referencia para significar la otra variable.

He encontrado que Resharper está equivocado algunas veces. Pero no usualmente Entonces me gustaría saber qué está pensando aquí.

¿Alguna idea?

+2

Creo que es más bien llama una clase anidada de subclase, que es más relevante para una clase derivada ;-) – Seb

+0

@Seb - buen punto. Cambié el título. – Vaccano

Respuesta

27

Supongo que porque usar SomeValue en la clase interna significa que se obtiene el valor asignado a la clase interna en lugar de a la clase externa.

Considera:

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

Actualmente Super.Sub.OtherValue volverá Inner pero la eliminación de la línea he comentado provocará que vuelva Outer

+0

¿Por qué votar abajo? – Joey

+0

No le impide acceder, pero debe calificar la referencia; var someValue = Super.SomeValue; –

+0

Sí, mala elección de palabras, lo cambiará. – Joey

2

parece que han arreglado, pero aún tienen que liberar la acumulación fijo: http://youtrack.jetbrains.net/issue/RSRP-277343#tab=History

EDITAR

Como nulltoken señaló, el enlace anterior es un escenario ligeramente diferente en el que tenemos una enumeración no es una cadena y los miembros no son estáticos, por lo que puede no aplicarse.

Además, esconde el exterior desde el interior ya que ahora necesita calificar una referencia Inner.SomeValue ya que solo SomeValue le dará el interior por defecto, por lo que en mi humilde opinión no es una advertencia tan mala.

+0

Puedo estar equivocado, pero creo que el problema al que apunta trata con un tema ligeramente diferente: Un Enum se declara en la clase principal y luego se usa en la clase anidada. – nulltoken

+0

@nulltoken, tienes razón, esta es una enumeración no una cadena y los miembros no son estáticos, por lo que no se aplica necesariamente. –

Cuestiones relacionadas