关于作用域,Mono C#编译器和MS C#编译器有何不同?

7

我在处理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#编译器不允许访问派生类的方法/属性等。为什么会这样?
1个回答

7
VS编译器遵循规范。不确定在Mono实现中允许它的原因是什么。
C#规范第10.11.1节“构造函数初始化程序”(获取C#规范的指令):
一个实例构造函数初始化程序不能访问正在创建的实例。 因此,在构造函数初始化程序的参数表达式中引用this是编译时错误,因为通过简单名称引用任何实例成员的参数表达式也是编译时错误。

1
听起来像是Mono中的一个错误。我怀疑在IL中很容易表示 - 这只是C#的限制。 - Jon Skeet
我在思考为什么会有这个限制,是因为当调用基类构造函数时,派生类还没有初始化,因此无法访问其实例成员吗? - imgen
1
在构造函数内部(包括基类构造函数),可以轻松访问“this”(即派生类的虚函数将被调用)。我认为原因是此时使用“this”将受到非常奇怪的限制和不相关的更改的影响(例如,将字段初始化从声明移到构造函数中可能会改变代码的行为)。 - Alexei Levenkov
确实 - 这基本上是从构造函数调用虚方法通常是一个坏主意的相同原因。 - Jon Skeet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接