我想使用 Lazy T实现记忆化,但初始化函数似乎需要静态上下文。
例如,以下代码拒绝编译,警告非静态成员 a 和 b 不可访问。我不清楚为什么会这样,因为 Lazy 对象本身就是一个实例成员,在静态上下文中不可见。
public class SomeExpensiveCalculation
{
private int a;
private int b;
public Lazy<int> Result = new Lazy<int>(() => a + b); //nope!
}
最佳答案
构造函数(或方法)之外的对象初始值设定项只能引用静态成员。这是因为在运行构造函数之前还没有构造实例,因此字段还没有“准备好”,因此不能被引用。静态字段之所以有效,是因为它们在字段之前被初始化。
请注意,错误不是由 Lazy<T>
引起的, 它是由 lambda 表达式引起的。解决方法(以及正确的方法)是初始化 Result
在构造函数中。
关于c# - 为什么 Lazy<T> 受限于静态上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6689838/