为什么 VB 不会像 C# 对“this”那样阻止在字段初始化中使用“Me”
本文关键字:字段 初始化 Me VB 为什么 this | 更新日期: 2023-09-27 18:33:49
在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'在当前上下文中不可用"。
我找到了这个问题/答案,它引用了 C# 语言规范第 7.6.7 节:
7.6.7 此访问
此访问仅在实例构造函数(实例(的块中允许方法或实例访问器。...(具体细节省略(...在主要 -上面列出的上下文以外的上下文中的表达式是编译时错误。在特别是,不可能在静态方法中引用它,静态属性
访问器,或在字段声明的变量初始值设定项中。
此外,这个问题涵盖了它(尽管在我的选择中,不足以回答它(,Oblivious Sage在这里对我问题的回答解释了原因 - 因为它是防止错误的功能。
为什么这个功能被排除在VB之外?
如此问题中所述,不同之处在于构造函数在 VB.NET 中的字段初始值设定项之前运行,但在 C# 中在字段初始值设定项之后运行。因此,在 VB.NET Me
中,当初始值设定项运行时是有效的引用,但在 C# 中,this
在运行时还不是有效的引用。
根据 Eric Lippert 的说法,C# 就是这样做的,这样他们就可以保证只读字段在被引用之前始终被初始化。
我没有在任何地方看到它明确说明,但是如果我不得不猜测,他们在 C# 仍在开发时注意到了 VB.NET 中的缺陷;然后他们觉得这是一个足够大的问题,值得在 C# 中修复,但还不够大,无法对 VB.NET 进行重大(并且可能广泛(更改。