为什么在C#中,成员初始值设定项不允许这样做,但在VB.Net中允许使用

时间:2013-03-13 09:15:12

标签: c# vb.net

我正在将一个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#?

这是由编译器以不同的方式处理它吗?这两个人有不同的行为似乎很奇怪。

为了解决这个问题,我想我会在构造函数中初始化成员。

2 个答案:

答案 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#中也不存在。