2012-08-06 10 views
8

Sto tentando di utilizzare il caricamento lazy per la prima volta per inizializzare un oggetto di avanzamento nella mia classe. Tuttavia, sto ottenendo il seguente errore:Lazy <T> Errore di caricamento lento: Un inizializzatore di campo non può fare riferimento al campo, metodo o proprietà non statica

A field initializer cannot reference the non-static field, method, or property.

private Lazy<Progress> m_progress = new Lazy<Progress>(() => 
{ 
    long totalBytes = m_transferManager.TotalSize(); 
    return new Progress(totalBytes); 
}); 

In .NET 2.0, posso effettuare le seguenti operazioni, ma io preferirei usare un altro approccio fino a oggi:

private Progress m_progress; 
private Progress Progress 
{ 
    get 
    { 
     if (m_progress == null) 
     { 
      long totalBytes = m_transferManager.TotalSize(); 
      m_progress = new Progress(totalBytes); 
     } 
     return m_progress; 
    } 
} 

Qualcuno può aiutare?

Molte grazie.

risposta

20

Tale inizializzatore richiederebbe il passaggio di this in una classe di acquisizione e this non è disponibile da un inizializzatore di campo. Tuttavia, è disponibili in un costruttore:

private readonly Lazy<Progress> m_progress; 
public MyType() 
{ 
    m_progress = new Lazy<Progress>(() => 
    { 
     long totalBytes = m_transferManager.TotalSize(); 
     return new Progress(totalBytes); 
    }); 
} 

Personalmente, mi basta usare il get di accesso, anche se, p

+0

ringrazio molto :) – bobbo

+0

L'inizializzazione pigra può restituire null, e essere ancora inizializzato. In questo caso, la proprietà getter vorrebbe inizializzarsi ancora e ancora. – wensveen

+0

@wensveen no non lo farà: https://gist.github.com/mgravell/b547455bb4afe25cdae44d8cc78b8bdd –

Problemi correlati