Lazy <t>延迟加载错误:字段初始值设定项无法引用非静态字段,方法或属性</t>

时间:2012-08-06 12:59:00

标签: c# .net generics lazy-loading

我第一次尝试使用延迟加载来初始化我班级中的进度对象。但是,我收到以下错误:

  

字段初始值设定项不能引用非静态字段,方法或属性。

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

在.NET 2.0中,我可以执行以下操作,但我更愿意使用更新的方法:

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

有人可以帮忙吗?

非常感谢。

1 个答案:

答案 0 :(得分:24)

该初始值设定项需要将this传递给捕获类,并且字段初始化程序无法使用this。但是, 在构造函数中可用:

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

就个人而言,我只是使用get访问者; p