为什么在C#中这不允许在成员初始化程序中,但在VB.Net中是允许的
我正在将一个VB.Net应用程序转换为C#,并注意到在VB.Net代码中,有一个私有成员变量,它使用Me
初始化,如下所示:
Private m_ClassA As New MyCollection(Of ClassA)(Me)
当我将其转换为C#代码时,如下所示:
private MyCollection _classA = new MyCollection(this);
我有错误
参数是
value
而参数类型是ref
。
如果我把ref
放在参数前面,我就会得到错误
不能在成员初始化程序中使用
this
。
我在这里读到成员在基类之前被初始化,所以this
不能在成员中使用,因为它可能尚未初始化。 我的问题是为什么它在VB.Net中合法而不是C#?
这是由编译器以不同的方式处理它吗? 这两个人有不同的行为似乎很奇怪。
为了解决它,我想我将在构造函数中初始化成员。
根据MSDN
。
仅在实例构造函数,实例方法或实例访问器的块中允许此访问。
这可以在这里阅读。
除了实例/构造函数之外,您无法在任何地方访问它。 所以你不能做这样的事情:
public class Foo { private Foo _foo = this; }
正如你所说,在C#
你将不得不使用方法/构造函数。
public class Foo { private Foo _foo; public Foo() { _foo = this; } public void InitializeFoo() { _foo = this; } }
MSDN
还为Me
说明以下内容:
Me关键字提供了一种引用代码当前正在执行的类或结构的特定实例的方法。 我的行为类似于对象变量或引用当前实例的结构变量。
听起来好像一旦类执行了你就可以访问this
,但只能在实例方法中使用,而在VB.NET
你可以在类执行时获得访问权限,因此你无法按照你的说法使用它。
VB在.NET和VB.NET之前就已存在,因此存在一些开发人员在.NET引入时不想删除的function。 另一个这样的function是“On Error Resume Next”,它在C#中也不存在。