为什么 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 不会像 C# 对“this”那样阻止在字段初始化中使用“Me”

如此问题中所述,不同之处在于构造函数在 VB.NET 中的字段初始值设定项之前运行,但在 C# 中在字段初始值设定项之后运行。因此,在 VB.NET Me 中,当初始值设定项运行时是有效的引用,但在 C# 中,this 在运行时还不是有效的引用。

根据 Eric Lippert 的说法,C# 就是这样做的,这样他们就可以保证只读字段在被引用之前始终被初始化。

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