在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之外?
答案 0 :(得分:15)
如this question中所述,不同之处在于构造函数在VB.NET中的字段初始化器之前运行,而在C#中的字段初始化器之后运行。因此,在VB.NET中,Me
是初始化程序运行时的有效引用,但在C#this
运行时它们还不是有效引用。
Per Eric Lippert C#这样做是为了保证readonly字段在被引用之前始终被初始化。
我没有看到它在任何地方明确说明,但如果我不得不猜测他们注意到VB.NET中的缺陷,而C#仍在开发中;然后他们觉得在C#中修复这个问题是一个很大的问题,但是对VB.NET进行破坏(并且可能是广泛的)改变并不是一个足够大的问题。