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

Вот мой код:

private BitsManager manager;
private const string DisplayName = "Test Job";       

public SyncHelper()
{
    manager = new BitsManager();
}        

BitsJob uploadBitsJob = manager.CreateJob(DisplayName, JobType.Upload);

Я получаю следующую ошибку:

A field initializer cannot reference the non-static field, method, or property 'BITSIntegrationModule.SyncService.SyncHelper.manager'


person Madurika Welivita    schedule 04.03.2013    source источник
comment
И с какой частью сообщения у вас проблемы?   -  person Damien_The_Unbeliever    schedule 04.03.2013
comment
Вопрос был бы более ясным, если бы OP включал объявление класса для SyncHelper.   -  person P.Brian.Mackey    schedule 04.03.2013
comment
Не забудьте задать вопрос в своем вопросе. Здесь нет вопросов, просто описание некоторого поведения.   -  person Eric Lippert    schedule 04.03.2013


Ответы (3)


Линия

BitsJob uploadBitsJob = manager.CreateJob(DisplayName, JobType.Upload);

не может получить доступ к менеджеру, потому что для него еще ничего не установлено - вы можете переместить выделение в конструктор -

private readonly BitsManager manager;
private const string DisplayName = "Test Job";       
BitsJob readonly uploadBitsJob;

public SyncHelper()
{
  manager = new BitsManager();
  uploadBitsJob = manager.CreateJob(DisplayName, JobType.Upload);
}   
person NDJ    schedule 04.03.2013
comment
Я бы также добавил только чтение в uploadBitsJob, чтобы убедиться, что его нельзя изменить после создания объекта. Если это имеет смысл. - person GregC; 04.03.2013
comment
Вы просите меня также переместить BitsJob uploadBitsJob = manager.CreateJob(DisplayName, JobType.Upload); часть в конструктор. B'cos manager = new BitsManager(); уже находится в конструкторе. - person Madurika Welivita; 04.03.2013
comment
Я обновил немного больше кода - я хотел выделить uploadBitsJob в конструкторе - он не может быть инициализирован, как вы это делаете сейчас, потому что менеджер не установлен до конструктора - person NDJ; 04.03.2013
comment
@NDJ да, переход в конструктор работает нормально .. Но все же я немного запутался в том, что происходит, если вы можете объяснить мне это немного подробнее. Благодарю. - person Madurika Welivita; 04.03.2013
comment
Если бы вы настраивали его так, чтобы он произносил новый BitsJob, то все было бы хорошо - BitsJob uploadBitsJob = new BitsJob (); Но, поскольку для этого должен быть установлен менеджер, вам нужно отложить распределение до тех пор, пока менеджер не обратится к чему-то действительному. - person NDJ; 04.03.2013
comment
@MadurikaWelivita - правила C # гласят, что вам не разрешен доступ к каким-либо методам / полям / свойствам экземпляра, когда вы используете инициализатор поля. Вот что говорит ошибка. Этого вам следует избегать. Сложно понять, как еще это сказать. - person Damien_The_Unbeliever; 04.03.2013
comment
@NDJ, спасибо, так почему же недостаточно оставить в конструкторе только `manager = new BitsManager ();`? - person Madurika Welivita; 04.03.2013
comment
Как говорит Damien_The_Unbeliever, поскольку uploadBitsJob не может быть создан с опорой на метод / поле / свойство экземпляра - и для создания вашего uploadBitsJob вам понадобится метод экземпляра менеджера CreateJob. - person NDJ; 04.03.2013

uploadBitsJob объявлен на уровне класса, что делает его полем. Экземпляры полей нельзя использовать для инициализации других полей.

Вместо этого вы можете объявить поле без его инициализации:

BitsJob uploadBitsJob;

Затем инициализируйте поле в конструкторе:

public SyncHelper()
{
  manager = new BitsManager();
  uploadBitsJob = manager.CreateJob(DisplayName, JobType.Upload);//here.  Now manager is initialized
}  
person P.Brian.Mackey    schedule 04.03.2013

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

person Russki    schedule 04.03.2013
comment
То, что вы описываете, никогда не может вызвать это сообщение об ошибке. Это может быть вызвано только тогда, когда инициализатор поля ссылается на нестатический член. - person Servy; 04.03.2013