2013-03-04 11 views
7

Po to mój kod:initializer pole nie może odwoływać się do pola non-static, metody lub właściwości

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

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

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

otrzymuję następujący błąd:

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

+2

A co część wiadomości masz problem z ? –

+0

Pytanie byłoby bardziej jasne, gdyby program operacyjny zawierał deklarację klasy "SyncHelper". –

+2

Nie zapomnij o * zadać pytanie * w swoim pytaniu. Tutaj nie ma wątpliwości, tylko opis jakiegoś zachowania. –

Odpowiedz

10

Linia

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

nie może uzyskać dostępu do menedżera, ponieważ nie został ustawiony na coś jeszcze - można przenieść przydział do konstruktora -

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

Dodałbym również tylko do odczytu na uploadBitsJob, aby upewnić się, że nie można go zmienić po utworzeniu obiektu. Jeśli to ma sens. – GregC

+0

Czy prosisz mnie o przeniesienie 'BitsJob uploadBitsJob = manager.CreateJob (DisplayName, JobType.Upload);' dodaj również do konstruktora. B'cos 'manager = new BitsManager();' jest już w konstruktorze. –

+0

Zaktualizowałem nieco więcej kodu - chciałem przydzielić uploadBitsJob do konstruktora - nie można zainicjować sposobu, w jaki to robisz, ponieważ menedżer nie jest ustawiony, dopóki konstruktor – NDJ

-4

To zwykle dzieje podczas próby uzyskać dostęp do właściwości niestatycznych z metody statycznej. Podaj nieco więcej kodu.

+3

To, co opisujesz, nigdy nie może spowodować wyświetlenia tego komunikatu o błędzie. Może to być spowodowane tylko wtedy, gdy * inicjator pola * odwołuje się do niestatycznego elementu. – Servy

2

uploadBitsJob została zadeklarowana w poziom klasy, który czyni z niej pole. Instancje pól nie mogą być użyte do zainicjowania innych pól.

Zamiast tego można zadeklarować pola bez inicjalizacji:

BitsJob uploadBitsJob;

Następnie zainicjować pole w konstruktorze:

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