为什么Lazy <T>受限于静态上下文?

Dan*_*bel 31 c# .net-4.0 lazy-initialization

我想使用Lazy T来实现memoization,但初始化函数似乎需要一个静态上下文.

例如,以下代码拒绝编译,警告非静态成员ab不可访问.我不清楚为什么会这样,因为Lazy对象本身就是一个实例成员,并且在静态上下文中没有可见性.

public class SomeExpensiveCalculation
{
    private int a;
    private int b;
    public Lazy<int> Result = new Lazy<int>(() => a + b); //nope!
}
Run Code Online (Sandbox Code Playgroud)

lar*_*moa 32

构造函数(或方法)之外的对象初始值设定项只能引用静态成员.这是因为在构造函数运行之前尚未构造实例,因此字段不是"就绪",因此无法引用.静态字段起作用,因为它们在字段之前初始化.

请注意,错误不是Lazy<T>由lambda表达式引起的.解决方法(以及执行此操作的正确方法)是Result在构造函数中初始化.

  • 对于ChessHound:这就是为什么代码不起作用.它与懒惰类型无关. (5认同)

Ond*_*dra 12

我不知道为什么你的代码不起作用,但这应该工作:

    public class SomeExpensiveCalculation
    {
        private int a;
        private int b;
        public Lazy<int> Result;
        public SomeExpensiveCalculation()
        {
             Result = new Lazy<int>(() => a + b);
        }
    }
Run Code Online (Sandbox Code Playgroud)