2017-02-17 4 views
-4
public class Program 
{ 
    public readonly string val; // THIS IS AN ERROR? 
    static void Main(string[] args) 
    { 
     // get parameter value 
     if (args.Length>0) 
     { 
      val = args[0]; 

Не могли бы вы рассказать нам, почему я получаю сообщение об ошибке? И лучший способ поставить значение аргумента внутри переменной const или readonly?Невозможно объявить свойство readonly в основном классе?

ответ

4

Две вещи отметить здесь:

  • только для чтения поля назначения могут происходить только в рамках декларации или в конструкторе в том же классе.

  • Ваше поле нестатически, в то время как ваша основная функция статична. Вы не можете установить нестационарную переменную в статическом контексте. Для нестатического поля требуется экземпляр класса.

Я предлагаю вам отметить свое поле как статическое и присвоить значение переменной, где вы объявляете

Следующий код должен работать

public class Program 
{ 
    public static string val; // THIS IS AN ERROR? 
    static void Main(string[] args) 
    { 
     // get parameter value 
     if (args.Length>0) 
     { 
      Program.val = args[0]; 
+0

Что это значит, что функция 'Main' статична? 'Программа' не является статическим классом. – wkl

+1

В консольных приложениях основная функция - это точка входа вашей программы и вызывается средой. Статические функции можно вызывать без создания экземпляра объекта/экземпляра класса. См. Главу 10 в спецификации языка: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf –

+0

Это имеет смысл. – wkl

1

Это не имеет никакого отношения к классу, в котором он находится. Вам нужно только инициализировать его значением либо в объявлении, либо в конструкторе. (Поскольку это только для чтения, вы не можете назначить его позже.)

public readonly string val = "myString"; 
+0

Это на самом деле не верно, так как вы можете назначить 'readonly' как с инстанцированными значениями внутри конструктора. – Andrew

+0

@Andrew Это правда, что вы должны его инициализировать. Но я не сказал, что это возможно и в конструкторе. Вместо этого я пошел на простейшее решение, учитывая код OP. Но теперь я отредактировал свой ответ, чтобы сделать это ясно. – wkl

+0

Всегда лучше дать истинный ответ, а не только половину его. – Andrew

0

Необходимо немедленно присвоить его значение. Иначе как это может быть «только для чтения»?

0

Readonly должно быть присвоено либо объявлению, либо внутри конструктора для этого класса. Это то, что делает его только для чтения.

Возможно, лучшим вариантом является этот

public string val {get; private set;} 

таким образом он может быть установлен только в классе Program.

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