C# 为什么VB不阻止使用;“我”;在字段初始化中,如C“使用”所做;这是什么;?
在VB中,您可以拥有以下功能:C# 为什么VB不阻止使用;“我”;在字段初始化中,如C“使用”所做;这是什么;?,c#,vb.net,clr,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)
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”在当前上下文中不可用”
我找到了引用第7.6.7节的内容:
7.6.7此访问
A仅在实例构造函数的块(实例)中允许此访问
方法或实例访问器。。。(细节省略)。。。在主应用程序中使用此选项-
上面列出的上下文以外的上下文中的表达式是编译时错误。在特别是,不可能在静态方法(静态属性)中引用它 访问器,或在字段声明的变量初始值设定项中 此外,本文还介绍了它(尽管在我的选择中,并没有充分回答它),而Sage对我的问题的回答解释了原因——因为这是一个bug预防功能 为什么VB没有使用此功能?如中所述,区别在于构造函数在VB.NET中的字段初始值设定项之前运行,而在C#中的字段初始值设定项之后运行。因此,在VB.NET中,当初始值设定项运行时,
Me
是一个有效的引用,但在C#中,当它们运行时,此
还不是一个有效的引用
Per C#这样做是为了确保只读字段总是在被引用之前进行初始化
我在任何地方都没有看到明确的声明,但如果我不得不猜测的话,他们在开发C#时注意到了VB.NET中的缺陷;然后,他们觉得这是一个足够大的问题,值得在C#中解决,但不是一个足够大的问题,不值得打破(可能是广泛的)改为VB.NET。这个问题似乎离题了,因为它是关于猜测语言设计师为什么选择做出特定决定的。@Servy--你只是在编造原因吗?初始化对象时,操作顺序可能会有所不同。C#不允许这样做,因为在创建的
One
是有效对象之前,myTwo
初始值设定项将运行。@roryap我使用了自定义关闭原因,是的。我本可以用“主要基于意见”来代替,这也适用,但为了清晰起见,我选择更明确一些。任何人都能做的一个问题就是猜测其他人的想法不在这里的主题中。@Servy——你想的全错了。另外,祝贺你打破了四位数……欢迎加入俱乐部:)你确定不在vb.net的一两个设计师之间吗?:-)回答得好;稍微澄清一下:在引用只读字段之前对其进行初始化是一个理想的结果,但该功能通常可以防止在对象的构造函数运行之前访问对象的成员所导致的整个类错误。