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

标签 c# .net-4.0 lazy-initialization

我想使用 Lazy T实现记忆化,但初始化函数似乎需要静态上下文。

例如,以下代码拒绝编译,警告非静态成员 ab 不可访问。我不清楚为什么会这样,因为 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/

相关文章:

C# 工厂模式

c# - 无法在我的 View 中绑定(bind)超链接命令和 ICommand

swift - 如何确保 CLLocationManager 在主线程上延迟实例化?

java - 如果未访问类,是否保证 static init 不运行?

c# - 从 Silverlight 重定向到另一个页面

c# - 如何从 MemoryStream 中删除数据

c# - for 循环中的子字符串提取的字符多于应有的字符

asp.net-mvc-3 - 为什么 WebGrid 在格式化时使用动态?

c# - 如何正确设置 HttpClient 的延续?

swift 2.0 : infer closure type error