为什么声明为实例字段的lambda委托只能访问静态成员?
错误原因
你遇到的报错和lambda本身是否为静态没有关联,问题出在lambda的定义位置:
你是在类字段初始化器中直接定义并赋值了这个lambda,C#语言规范明确规定:类的字段初始化器不允许访问当前实例的this以及任何实例成员,因为字段初始化的执行时机早于实例构造函数的执行逻辑,此时实例还未完成初始化,访问实例成员属于不安全操作。
你的lambda需要捕获实例字段_service,本质上是要引用this._service,但字段初始化器的上下文不允许访问实例相关的内容,编译器就会判定当前属于静态上下文,因此抛出对应的错误。
补充说明:C# 11新增的静态lambda特性是显式禁止lambda捕获实例或静态成员,和你遇到的场景无关,你的代码没有加static修饰lambda,问题完全是定义位置导致的。
修复方案
把lambda的赋值逻辑挪到类的构造函数中即可,构造函数执行时实例已经完成基础初始化,可以正常访问实例成员:
public class Demo { private IService _service; // 仅声明字段,不在字段初始化器中赋值 Action<Guid> action; public Demo() { // 构造函数内赋值lambda,可正常捕获_service action = v => _service.CallServiceWithParameter(v); } }
内容的提问来源于stack exchange,提问作者Michael Wiles
相关产品推荐
相关产品推荐

