9
C#がインデックス付きプロパティを実装しないのはなぜですか?
私は知っています、私は知っています...この種の質問に対するエリック・リペットの答えは、通常、「設計、実装、テスト、および文書化のコストに見合う価値がなかったため」のようなものです。 しかし、それでも、もっと良い説明が欲しいのですが...新しいC#4機能についてのこのブログ投稿を読んでいて、COM相互運用に関するセクションで次の部分が私の注意を引きました: ちなみに、このコードはもう1つの新機能を使用しています。インデックス付きプロパティ(範囲の後の角括弧を詳しく見てください)。ただし、この機能はCOM相互運用でのみ使用できます。C#4.0で独自のインデックス付きプロパティを作成することはできません。 いいけどなんで ?C#でインデックス付きプロパティを作成できないことはすでに知っていて後悔していましたが、この文でもう一度考えさせられました。私はそれを実装するいくつかの正当な理由を見ることができます: CLRは、それが(例えば、サポートしPropertyInfo.GetValueているindexことが、我々はC#で、それを利用することはできません残念ですので、パラメータ) 記事に示されているように、COM相互運用でサポートされています(動的ディスパッチを使用) VB.NETに実装されています インデクサーを作成すること、つまりオブジェクト自体にインデックスを適用することはすでに可能です。そのため、同じ構文を維持thisし、プロパティ名に置き換えるだけで、アイデアをプロパティに拡張することはおそらく大したことではありません。 それはそのようなことを書くことを可能にするでしょう: public class Foo { private string[] _values = new string[3]; public string Values[int index] { get { return _values[index]; } set { _values[index] = value; } } } 現在私が知っている唯一の回避策はValuesCollection、インデクサーを実装する内部クラス(たとえば)を作成し、Valuesその内部クラスのインスタンスを返すようにプロパティを変更することです。 これは非常に簡単ですが、面倒です...おそらくコンパイラが私たちのためにそれを行うことができます!オプションは、インデクサーを実装する内部クラスを生成し、パブリックジェネリックインターフェイスを介して公開することです。 // interface defined in the namespace System public interface IIndexer<TIndex, …