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

Mat*_*t_J 17 c# vb.net

我正在将一个VB.Net应用程序转换为C#,并注意到在VB.Net代码中,有一个私有成员变量,它使用Me如下初始化:

Private m_ClassA As New MyCollection(Of ClassA)(Me)
Run Code Online (Sandbox Code Playgroud)

当我将其转换为C#代码时,如下所示:

private MyCollection<ClassA> _classA = new MyCollection<ClassA>(this);
Run Code Online (Sandbox Code Playgroud)

我有错误

理由是value虽然参数类型ref.

如果我把ref参数放在前面this,我就会收到错误

不能this在成员初始化程序中使用.

我在这里读到成员在基类之前被初始化,因此this不能在成员中使用,因为它可能尚未初始化.我的问题是为什么它在VB.Net中合法而不是C#?

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

为了解决它,我想我将在构造函数中初始化成员.

Luk*_*ley 4

根据MSDN

仅允许在实例构造函数、实例方法或实例访问器的块中进行 this 访问。

可以在这里阅读。

除了实例/构造函数之外,您无法在任何地方访问它。所以你也不能做这样的事情:

public class Foo
{
  private Foo _foo = this;
}
Run Code Online (Sandbox Code Playgroud)

正如您所说,C#您将不得不使用方法/构造函数。

public class Foo
{
  private Foo _foo;
  public Foo()
  {
    _foo = this;
  }
  public void InitializeFoo()
  {
    _foo = this;
  }
}
Run Code Online (Sandbox Code Playgroud)

MSDN还规定了以下内容Me

Me 关键字提供了一种引用当前正在执行的代码的类或结构的特定实例的方法。Me 的行为类似于引用当前实例的对象变量或结构变量。

听起来好像一旦类执行完毕,您就可以访问this,但只能在实例方法中VB.NET访问,而在 中 您可以在类执行时访问,因此您不能像您所说的那样使用它。