首页 > 解决方案 > 为什么 C# 编译器在字段初始化期间无法绑定实例委托?

问题描述

查看众所周知的CS0236 错误消息

错误 (CS0236):字段初始值设定项无法引用非静态字段、方法或属性,并且

这种限制的原因是初始化顺序:

您不能使用实例变量来初始化另一个实例变量。

this不是实例变量,是吗?我的问题是为什么即使对引用方法也有如此严格的要求?据我了解,仅限制类方法的调用就足够了,例如:

bool _field;
bool GetField() => _field;
bool _field2 => GetField(); // clearly an error, invoking something that might not be initialized
// why compiler cannot safely bind a delegate? It does not have to access anything, just take an address
Func<bool> Func1 = GetField; // does not have to error, refencing but not invoking

这只是一个设计决定,还是有任何技术限制阻止在字段初始化期间进行委托绑定?


编辑:我对技术方面感兴趣,而不是修复错误。是什么阻止了编译器绑定实例方法?的地址this必须在绑定发生时可用,并且类似的东西funcPtr = instanceaddress+memberoffset似乎对初始化没有任何副作用。

标签: c#delegatesinitializationthis

解决方案


推荐阅读