Mono C#编译器和MS C#编译器在范围方面的差异

Mono C#编译器和MS C#编译器在范围方面的差异,c#,visual-studio-2010,compiler-construction,mono,compiler-errors,C#,Visual Studio 2010,Compiler Construction,Mono,Compiler Errors,我现在讨论的是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) =>

我现在讨论的是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 Implementation中允许它的原因是什么

,第10.11.1节建造商初始值设定人:

实例构造函数初始值设定项无法访问正在创建的实例。因此,在构造函数初始值设定项的参数表达式中引用它是编译时错误,参数表达式通过简单名称引用任何实例成员也是编译时错误


在我看来,这只是单声道的一个缺陷。我怀疑它很容易在IL中表示-这是一个纯粹的C#限制。我在想为什么会有这种限制,是因为调用基类构造函数时,派生类还没有初始化,因此无法访问其实例成员吗?可以很容易地访问构造函数中的“this”(包括基类-即,将调用派生类的虚拟函数)。我认为原因是,在该点上使用它将受到非常奇怪的限制和不相关的更改(即,将字段初始化从声明移动到构造函数)实际上,这与从构造函数调用虚拟方法通常是个坏主意的原因基本相同。