2012-08-06 12 views
8

Estoy intentando utilizar la carga diferida por primera vez para inicializar un objeto de progreso en mi clase. Sin embargo, estoy recibiendo el siguiente error:Lazy <T> Error de carga diferida: un inicializador de campo no puede hacer referencia al campo, método o propiedad no estáticos

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

En .NET 2.0, que puede hacer lo siguiente, pero yo preferiría usar un enfoque más hasta la fecha:

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; 
    } 
} 

¿Alguien puede ayudar?

Muchas gracias.

Respuesta

20

Ese inicializador requerirá que this pase a una clase de captura, y this no está disponible desde un inicializador de campo. Sin embargo, es disponibles en un constructor:

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

Personalmente, sólo tiene que utilizar el descriptor de acceso get, sin embargo; p

+0

Muchas gracias :) – bobbo

+0

El inicializador perezoso puede devolver null, y aún ser inicializado El getter de la propiedad en ese caso intentará inicializar una y otra vez. – wensveen

+0

@wensveen no, no lo hará: https://gist.github.com/mgravell/b547455bb4afe25cdae44d8cc78b8bdd –

Cuestiones relacionadas