2014-09-24 2 views
0

Вот кусок кода С #, в котором у меня есть сомнения.Почему использование нестатических элементов в статическом контексте не дает ошибки?

class Program 
{ 
    class DOB { int d, m, y; } 
    int a; 
    enum Month { jan, feb, mar }; 
    static void Main(string[] args) 
    { 
     a = 6;      //Showing error 
     DOB d = new DOB(); //DOB is not static; still no error. 
     Month m = 0;  //Month is non static but not showing error(I know it cannot be static) 
     Console.WriteLine(m); 
     Console.ReadKey(); 
    } 
} 

Назначение для переменной показывает ошибку, потому что он не является статическим членом. В то же время класс DOB и перечисление Месяц также не статичны, но это не ошибка whing.

+0

Вы не _assigning_ значение, вы инициируете новый объект. Regardind your 'enum', вы действительно делаете то же самое: создаете новый член типа' Month'. –

ответ

1

Вы не можете получить доступ к экземплярам экземпляра из статического класса или метода.

a - это поле экземпляра Program, поэтому вы получите сообщение об ошибке a = 6.
DOB d = new DOB() просто создает новый объект класса DOB и присваивает его локальной переменной.
Month m = 0 также создает новую локальную переменную.

Если бы вы написали

[...] 
DOB d; 
static void Main(string[] args) 
{ 
    d = new DOB(); 

вы получили бы ту же ошибку, как и для a.

+0

Я понимаю ошибку при ** a **. Класс ** DOB ** также является членом класса ** Программа **; Как я могу его использовать? Я не так понимаю. Я думаю, что переменная ** ** и класс ** DOB ** являются членами одного уровня класса ** Program **. Где я иду не так? – sanjay

+0

@sanjay 'DOB' не является членом' Program', это вложенный класс. – Dirk

+0

ОК, я получил разницу. Басически я изучаю C# (имею знания в java). Я просто пробовал одну и ту же программу в java, и она показывает ошибку около создания объекта для DOB. В java нам нужно сначала создать объект для программы, а затем у нас есть вызов конструктора DOB с отсутствием программы. Какая разница? – sanjay

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