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されるため、まだ初期化されていない可能性があるため、メンバーで使用できないことを読みました。私の質問は、C# ではなく VB.Net で合法なのはなぜですか?

これは、コンパイラの処理方法が異なるためですか? 2人の行動が違うのは奇妙に思えます。

それを回避するには、コンストラクターでメンバーを初期化すると思います。

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 の導入時に開発者が削除したくない機能がいくつか存在していました。もう 1 つのそのような機能は、C# には存在しない "On Error Resume Next" です。

于 2013-03-13T09:23:25.150 に答える