2013-03-04 1 views
7

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

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'

+2

И какая часть сообщения у вас есть проблемы с ? –

+0

Вопрос был бы более понятным, если бы OP включала объявление класса для 'SyncHelper'. –

+2

Не забудьте задать вопрос * в своем вопросе. Здесь нет никакого вопроса, просто описание какого-то поведения. –

ответ

10

Линия

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); 
} 
+0

Я бы также добавил readonly on uploadBitsJob, чтобы убедиться, что он не может быть изменен после создания объекта. Если это имеет смысл. – GregC

+0

Просите меня переместить 'BitsJob uploadBitsJob = manager.CreateJob (DisplayName, JobType.Upload);' part into constructor. B'cos 'manager = new BitsManager();' уже находится внутри конструктора. –

+0

Я обновил немного больше кода - я хотел выделить uploadBitsJob в конструкторе - он не может быть инициализирован, как вы сейчас это делаете, потому что менеджер не установлен до тех пор, пока конструктор – NDJ

-4

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

+3

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

2

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

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

BitsJob uploadBitsJob;

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

public SyncHelper() 
{ 
    manager = new BitsManager(); 
    uploadBitsJob = manager.CreateJob(DisplayName, JobType.Upload);//here. Now manager is initialized 
}