为什么VB不能阻止在字段初始化中使用“我”像C#一样用“this”?

时间:2014-12-10 18:03:11

标签: c# vb.net clr

在VB中你可以拥有:

Class One
    Private myTwo As Two = New Two(Me)
End Class

Class Two
    Sub New(withOne As One)

    End Sub
End Class

但是在C#中,你不能这样做:

class One
{
    private Two myTwo = new Two(this);
}

class Two
{
    public Two(One withOne)
    {

    }
}

因为您收到错误“关键字'此'在当前上下文中不可用”。

我发现this question/answer引用了the C# language specification第7.6.7节:

  

7.6.7此访问权限

     

只允许在实例构造函数的块中实现此访问   方法或实例访问器。 ......(具体细节省略)......在初级中使用   在上面列出的上下文中的表达式是编译时错误。在
  特别是,不可能在静态方法,静态属性中引用它   访问者,或在字段声明的变量初始化程序中。

此外,this question涵盖了它(虽然,在我的选择中,没有充分回答),而Oblivious Sage在这里回答我的问题解释了原因 - 因为它是防止bug的功能。

为什么这个功能不在VB之外?

1 个答案:

答案 0 :(得分:15)

this question中所述,不同之处在于构造函数在VB.NET中的字段初始化器之前运行,而在C#中的字段初始化器之后运行。因此,在VB.NET中,Me是初始化程序运行时的有效引用,但在C#this运行时它们还不是有效引用。

Per Eric Lippert C#这样做是为了保证readonly字段在被引用之前始终被初始化。

我没有看到它在任何地方明确说明,但如果我不得不猜测他们注意到VB.NET中的缺陷,而C#仍在开发中;然后他们觉得在C#中修复这个问题是一个很大的问题,但是对VB.NET进行破坏(并且可能是广泛的)改变并不是一个足够大的问题。