我在这里遇到一个极端情况,涉及 C# 中实例方法/属性范围的差异。这是代码:
public class Base
{
public EventHandler Click {get;set;}
public Base(EventHandler clickHandler)
{
this.Click = clickHandler;
}
}
public class Derived: Base
{
public Derived(): base((sender, e) => Execute())
{
}
private void Execute()
{
}
}
代码在 MonoDevelop 3.0 上编译良好,但在 VS2010 中给出错误: 非静态字段、方法或属性“Base.Execute”需要对象引用 基本上,它可以归结为这样一个事实:当从派生类的构造函数调用基类的构造函数时,MS 的 C# 编译器不允许访问派生类的方法/属性等。这是怎么回事?
VS编译器遵循规范。不确定 Mono 实现中允许它的原因是什么。
C# 规范,第 10.11.1 节构造函数初始值设定项:
实例构造函数初始值设定项无法访问正在创建的实例。因此,在构造函数初始值设定项的参数表达式中引用 this 是一个编译时错误,就像参数表达式通过简单名称引用任何实例成员时会出现编译时错误一样。