2012-01-18 21 views
23

Với đoạn mã sau:Tại sao Resharper nghĩ rằng một lớp bên trong với thuộc tính "SomeValue" ẩn một thuộc tính có cùng tên trong lớp ngoài?

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

    public static string SomeValue { get; set; } 
} 

Resharper nói với tôi rằng Super.Inner.SomeValue ẩn một tài sản từ các lớp bên ngoài.

Làm cách nào để ẩn đi? Bạn có hai tham chiếu riêng biệt (Super.SomeValueSuper.Inner.SomeValue). Và (theo như tôi biết), bạn không thể sử dụng một tham chiếu để có nghĩa là biến khác.

Tôi nhận thấy rằng tính năng chia sẻ lại đôi khi sai. Nhưng không thường. Vì vậy, tôi muốn biết những gì nó đang suy nghĩ ở đây.

Bất kỳ ý tưởng nào?

+2

Tôi nghĩ rằng nó khá gọi là lớp lồng nhau hơn lớp con, mà là nhiều hơn liên quan đến một lớp dẫn xuất ;-) – Seb

+0

@Seb - điểm tốt. Tôi đã thay đổi tiêu đề. – Vaccano

Trả lời

27

Tôi đoán vì nó có nghĩa là sử dụng SomeValue trong lớp bên trong có nghĩa là bạn nhận được giá trị được gán cho lớp bên trong chứ không phải lớp bên ngoài.

Hãy xem xét điều này:

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

Hiện nay Super.Sub.OtherValue sẽ trở lại Inner nhưng loại bỏ các dòng tôi đã nhận xét sẽ gây ra nó để trở về Outer

+0

Tại sao bỏ phiếu xuống? – Joey

+0

Nó không ngăn bạn truy cập vào nó, nhưng bạn phải hội đủ điều kiện tham chiếu; var someValue = Super.SomeValue; –

+0

Vâng, lựa chọn từ ngữ không hợp lý, sẽ thay đổi nó. – Joey

2

Hình như họ đã cố định nó, nhưng vẫn chưa giải phóng xây dựng cố định: http://youtrack.jetbrains.net/issue/RSRP-277343#tab=History

EDIT

Như nulltoken chỉ ra, các liên kết ở trên là một kịch bản hơi khác nhau, nơi chúng ta có một enum không phải là một chuỗi và các thành viên không tĩnh, vì vậy nó có thể không áp dụng.

Ngoài ra, nó ẩn bên ngoài từ bên trong vì bây giờ bạn cần đủ điều kiện tham chiếu Inner.SomeValue vì chỉ SomeValue sẽ cung cấp cho bạn bên trong theo mặc định, do đó IMHO không phải là cảnh báo xấu.

+0

Tôi có thể sai, nhưng tôi nghĩ rằng vấn đề bạn hướng tới các giao dịch có chủ đề hơi khác: An Enum được khai báo trong lớp cha, sau đó được sử dụng trong lớp lồng nhau. – nulltoken

+0

@nulltoken, bạn nói đúng, đây là một enum không phải là một chuỗi và các thành viên không tĩnh, vì vậy nó không nhất thiết phải áp dụng. –

Các vấn đề liên quan