2014-12-01 8 views
-3

В WPF я часто сталкиваюсь с этой проблемой, когда привязываю список к DataGrid и DataContext = new A();Доступ к внутреннему классу C#

class A 
{ 
    int x; 
    List<B> list; 

    class B 
    { 
    B() 
    { 
     // want to use x here, but i can't 
    } 
    } 
} 

Пожалуйста, предложите что-то

+4

Вы определяете класс. Не вложенный экземпляр. – Aphelion

+0

Существует, вероятно, более чистый способ делать то, что вы хотите, без этого. – crashmstr

+0

Возможный дубликат [Невозможно получить доступ к вложенным классам или членам базового класса] (http://stackoverflow.com/questions/25123351/cannot-access-nested-classes-or-members-of-base-class) – t3chb0t

ответ

7

Причина вы не можете получить доступ к нему, что вы не можете получить доступ к переменной экземпляра класса из внутреннего класса напрямую. Подумайте немного об этом; как бы экземпляр класса B знал, какой экземпляр класса A использовать для чтения значения переменной x?

Чтобы получить к нему доступ, вам необходимо предоставить экземпляр класса A для ctor of B. Другим способом сделать это (если он подходит вашим сценариям) было бы сделать x статическим, но я бы не предложил его в общем.

Для примера см это:

class A 
{ 
    int x; 
    List<B> list; 

    class B 
    { 
    B(A instance) 
    { 
     // Access x here using A.x; 
    } 
    } 

    public void AddToList() 
    { 
    list.Add(new B(this)); 
    } 
} 
+0

Чтобы быть справедливым, люди, пришедшие на C# с Java, ожидали, что это сработает, потому что язык поддерживает эту ссылку неявно по умолчанию (т.е. нестатические вложенные классы). То есть когда вы спрашиваете «как бы экземпляр класса B знал, какой экземпляр класса A использовать», в Java он знает, потому что этот экземпляр класса A определяется, когда экземпляр класса B создается с использованием этого экземпляра класса A. C# doesn ' так поступаю (и я рад за это), но это возможно. –

+0

@PeterDuniho: Я этого не знал. Спасибо! – SKleanthous

Смежные вопросы