Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство - PullRequest
3 голосов
/ 03 декабря 2011

Хорошо, так что у меня есть код ниже, технически все, что он делает, это читает файл db.txt построчно, а затем предполагает разделить строку 0 на массив с именем password.

private string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
private string[] password = lines[0].Split(' ');

но я получаю ошибку:

Инициализатор поля не может ссылаться на нестатическое поле, метод или свойство

Ответы [ 4 ]

4 голосов
/ 03 декабря 2011

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

Компиляторфактически говорит вам, что это неправильный способ что-то делать.

Лучший способ - просто написать функцию, которая делает то, что вы хотите:

private string[] PasswordLines(){
  string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
  return lines[0].Split(" "); 
}

Затем вы можете вызвать этооткуда угодно;например:

public class MyClass()
{
 private string[] Lines 
 {
   get { return PasswordLines(); }
 }

 private string[] PasswordLines(){
  string[] lines = System.IO.File.ReadAllLines(@"U:\Final Projects\Bank\ATM\db.txt");
  return lines[0].Split(" "); 
 }

}
4 голосов
/ 03 декабря 2011

C # не гарантирует какой-либо определенный порядок выполнения, когда дело доходит до инициализации поля.
Например, эти две строки кода будут давать неопределенные результаты:

private int a = b + 1;
private int b = a + 1;

в теории два возможных результатаa = 1, b = 2 или a = 2, b = 1, но на самом деле это даже хуже.Мы даже не знаем, инициализированы ли a и b их значениями по умолчанию (0 в случае int), поэтому это может быть что угодно (как ссылка на неинициализированный объект).Чтобы избежать этого сценария, который невозможно решить, компилятор требует, чтобы все инициализации поля были «постоянными времени выполнения» (возвращать одно и то же значение каждый раз, когда они выполняются и не зависят от любых других переменных, не являющихся постоянными времени выполнения).).

Просто используйте конструктор при инициализации составных полей, и жизнь снова станет сладкой.

2 голосов
/ 03 декабря 2011

Именно то, что говорит! Это инициализаторы полей (экземпляров), и они не могут ссылаться друг на друга. Вместо этого переместите код в конструктор или сделайте их переменными метода вместо полей.

1 голос
/ 03 декабря 2011

Ошибка не требует пояснений.

Вы не можете сделать это, поскольку строки и пароль являются переменными поля, и вы не можете присвоить

одно из них значению другому (если оностатические, то вы можете).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...