2013-04-24 5 views
5

Я начал изучать C#. Я пытаюсь объявить класс и некоторые переменные и попытаюсь выполнить простую конкатенацию строк. Но я получаю ошибку - код нижеНужно объяснение с новичком C# код

namespace ConsoleApplication1 
{ 
    class Class1 
    { 
     string s1 = "hi"; 
     string s2 = "hi"; 
     string s3 = s1 + s2; 
    } 
} 

Погрешности я получаю - поля инициализатор не может ссылаться на нестатическое поле, метод, свойство «ConsoleApplication1.Class1.s1

Может кто-нибудь объяснить, что здесь происходит.

Спасибо.

ответ

15

Может кто-нибудь объяснить, что здесь происходит.

Ну, сообщение об ошибке компилятора говорит об этом, действительно, после того, как вы прошли терминологию. Эта линия является недействительной:

string s3 = s1 + s2; 

Вы объявляя переменный экземпляр и экземпляр инициализаторы переменной (s1 + s2 здесь) не может ссылаться на другие поля в экземпляре, который создается - или действительно сам экземпляр. Имейте в виду, что приведенное выше описание эквивалентно:

string s3 = this.s1 + this.s2; 

Из раздела 10.5.5.2 в # 4 спецификации C:

переменной инициализатор для поля экземпляра не может ссылаться на экземпляр создается. Таким образом, это ошибка времени компиляции, чтобы ссылаться на в переменном инициализаторе, поскольку это ошибка времени компиляции для инициализатора переменной для ссылки на любой экземпляр элемента с помощью простого имени .

(Правда, что это одна из наиболее более странно бит формулировок в спецификации ...)

Вы должны поставить логику в тело конструктора вместо:

class Class1 
{ 
    string s1 = "hi"; 
    string s2 = "hi"; 
    string s3; 

    public Class1() 
    { 
     s3 = s1 + s2; 
    } 
} 
6

Попытка инициализации s3 в способе, предпочтительно конструктор

class Class1 
{ 
    string s1 = "hi"; 
    string s2 = "hi"; 
    string s3; 


    public Class1() 
    { 
     s3 = s1 + s2; 
    } 
} 
+3

Это не факт, что здесь происходит «арифметика» (конкатенация строк), что является проблемой - это факт, что она неявно использует 'this'. –

8

Переменные не [логически] инициализируется в определенном порядке. Лучше всего создавать свои программы таким образом, чтобы они работали независимо от порядка инициализации переменных.

Для нетривиальных заданий локальных переменных, которые вы используете конструктор для этого типа:

class Class1 
{ 
    string s1 = "hi"; 
    string s2 = "hi"; 
    string s3; 

    public Class1() 
    { 
     s3 = s1 + s2; 
    } 
} 
+7

Это неверно. Из раздела 10.5.5 спецификации C# 4 (версия, к которой мне, вероятно, придется иметь дело): «Точно так же, когда экземпляр класса создается, все поля экземпляра в этом экземпляре сначала инициализируются значениями по умолчанию, а затем инициализаторы полей экземпляра выполняются ** в текстовом порядке **. " (Акцент мой.) –

+0

@JonSkeet Я отредактировал формулировку. Независимо от того, имеет ли реализация выполнение заказа, с концептуальной точки зрения, это не так, и лучше всего развиваться так, как будто он неупорядочен. – Servy

+0

Это довольно легко подтвердить с помощью отладчика. Я определенно заметил это поведение в инициализации поля экземпляра в моем собственном коде. – Chris

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