17

我正在将一个 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# 中是合法的?

这取决于编译器以不同的方式处理它吗?两人的行为不同,这似乎很奇怪。

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

4

2 回答 2

4

根据MSDN.

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

这可以在这里阅读。

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

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 关键字提供了一种方法来引用当前执行代码的类或结构的特定实例。Me 的行为类似于引用当前实例的对象变量或结构变量。

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

于 2013-03-13T09:27:09.510 回答
2

VB 在 .NET 和 VB.NET 之前就存在了,因此存在一些在 .NET 引入时开发人员不想删除的功能。另一个这样的功能是“On Error Resume Next”,它在 C# 中也不存在。

于 2013-03-13T09:23:25.150 回答