【发布时间】:2015-02-09 01:14:13
【问题描述】:
在 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' 在当前上下文中不可用”。
我发现 this question/answer 引用了 the C# language specification 第 7.6.7 节:
7.6.7 此访问权限
只有在实例构造函数的块中才允许 this 访问,即实例 方法或实例访问器。 ...(省略细节)...在主要使用这个- 在上面列出的上下文之外的上下文中的表达式是编译时错误。在
特别是,不可能在静态方法、静态属性中引用 this
访问器,或在字段声明的变量初始化器中。
此外,this question 涵盖了它(尽管在我看来,并没有充分回答它),并且 Oblivious Sage 对我的问题的回答解释了原因——因为它是防止错误的功能。
为什么 VB 忽略了这个功能?
【问题讨论】:
-
这个问题似乎离题了,因为它是关于猜测语言设计者选择做出特定决定的原因。
-
@Servy -- 你只是在编造这个理由吗?
-
初始化对象时操作顺序可能不同。 C# 不允许这样做,因为
myTwo初始化程序将在 创建One是一个有效对象之前运行。 -
@roryap 我使用了自定义关闭原因,是的。我本可以改用“主要基于意见”,它会适用,但为了清楚起见,我选择更明确。任何人都可以做的一个问题是猜测别人在想什么,这不是这里的主题。
-
@Servy -- 你认为这一切都错了。