2012-06-11 38 views
7

Tôi có một lớp C với một số biến nội bộ. Nó có một lớp N lồng nhau muốn truy cập các biến trong C. Không phải C và N là tĩnh, mặc dù C có một số phương thức tĩnh và các biến. Khi tôi cố gắng truy cập một biến không tĩnh trong C từ N, tôi nhận được gạch chân vặn vẹo và thông báo "Không thể truy cập trường không tĩnh [tên trường] trong ngữ cảnh tĩnh".Lớp lồng nhau: Không thể truy cập trường không tĩnh trong ngữ cảnh tĩnh

Điều này dường như có liên quan đến lớp lồng nhau, vì tôi có thể truy cập biến số tiền phạt từ chính lớp đó.

ReSharper đề nghị tôi tạo _t tĩnh nhưng đó không phải là một tùy chọn. Làm cách nào để giải quyết vấn đề này?

public sealed partial class C 
{ 
    string _t; 

    class N 
    { 
     void m() 
     { 
      _t = "fie"; // Error occurs here 
     } 
    } 
} 
+1

có thể trùng lặp của [Lớp bên trong và Lớp ngoài trong C#] (http://stackoverflow.com/questions/3155172/inner-class-and-outer-class-in-c-sharp) và http: //stackoverflow.com/questions/2367015/java-inner-classes-in-c-sharp –

Trả lời

12

Đây không phải là Java và bạn không có các lớp bên trong.

Một thể hiện của một lớp lồng nhau không liên kết với bất kỳ cá thể nào của lớp ngoài, trừ khi bạn tạo liên kết bằng cách lưu tham chiếu (còn gọi là handle/pointer) bên trong hàm tạo.

public sealed partial class C 
{ 
    string _t; 

    class N 
    { 
     readonly C outer; 

     public N(C parent) { outer = parent; } 

     void m() 
     { 
      outer._t = "fie"; // Error is gone 
     } 
    } 
} 
+2

Cuốn sách O'Reilly "Nutshell" (Albahari & Albahari) nói "Một loại lồng nhau ... có thể truy cập các thành viên riêng tư của loại bao vây và mọi thứ khác kèm theo có thể truy cập. " – Sisiutl

+1

@Sisiutl: Điều này không liên quan gì đến khả năng truy cập. Bởi vì quy tắc "Nutshell" đề cập đến, mã của tôi hoạt động ngay cả với 'chuỗi riêng _t;'. Nếu không có quy tắc đó, bạn sẽ cần hoặc là 'nội bộ' hoặc' công khai'. Một phương thức tĩnh cũng có quyền truy cập vào các thành viên riêng, nhưng cần cung cấp một tham chiếu cá thể trước khi sử dụng các thành viên không tĩnh. –

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