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