1

私はコレクションクラスを持っていMyCollection<T>ます。

を実装T this[string name]しましたが、正常に動作します。

私も実装しようとしましT Item(string name)たが、もちろんエラーが発生しました:

このタイプMyCollection<T>にはすでに Item の定義が含まれています

あるべきように。ただし、関数を実装して Item をオーバーロードしたいのですT Item(string, bool)が、これも同じエラーをスローします。

T Item(string, bool)なぜコンパイラはそれがインデクサーと衝突すると考えるのでしょうT Item(string)か? インデクサーではなく単なる通常のメソッドである場合、これら 2 つの宣言は 2 つの完全に有効なオーバーロードになります。

4

1 に答える 1

1

インデクサーは絶対にオーバーロードできますが、 というメソッドでオーバーロードすることはできませItem。インデクサーをオーバーロードするには、次のものが必要です。

public T this[string name, bool condition]
{
    get { ... }
    set { ... }
}

編集:さて、次のようになります:

  • C# 4 仕様のセクション 10.3 によると、同じ名前の異なる種類 (1 つのメソッド、1 つのプロパティ) の 2 つのメンバーを持つことはできません。
  • インデクサーとname のプロパティを持つことはできませんItem。これは、どちらも内部のプロパティであるため、少し驚くべきことです。

を使用してインデクサーのプロパティの生成された名前を変更すると、プロパティと一緒にインデクサーを呼び出すことができると思いますが、試したことはありません。ItemDefaultMemberAttribute

于 2012-06-27T11:09:25.467 に答える