2009-05-06 15 views
4

ことではないインデックスIは、クラスKeyedCollectionはint型

public class FooKeyedCollection : KeyedCollection<FooType,Foo> 
{ 
} 

public enum FooType 
{ 
    FooType1, 
    FooType2, 
    FooType3 
} 

public Foo 
{ 
    public FooType Type { get; set; } 
    public string Value { get; set; } 
} 

私はFooKeyedCollectionに項目を追加すると、私はFooTypeによって、インデックス、それらをすることができますが、私は彼らがint型のインデックスしようとすると、INTがあるがありますFooType列挙型と解釈されます。その結果、即ち

public static void main() 
{ 
    FooKeyedCollection fkc = new FooKeyedCollection(); 

    Foo myFoo = new Foo(); 
    myFoo.Type = FooType.FooType3; 
    myFoo.Value = "someValue"; 

    foo.Add(myFoo); 

    Foo myFooByType = foo[FooType.FooType3]; 
    Foo myFooByIndex = foo[0]; // <-- exception thrown here 
} 

、混乱エラーにつながる整数インデックスでアイテムを取得しようとすると、このコードの実行結果は、例外です。私は公開APIの一部としてFooKeyedCollectionを公開したいと思います。このAPIのコンシューマをこのエラーから保護したいと思います。適切な動作を得るためにFooKeyedCollectionクラスを変更できる方法はありますか?

答えて

3

あなたはここに「新しい」キーワードを使用して検討するかもしれない:

public new Foo this[int index] 
{ 
    get 
    { 
     IList<Foo> self = this; 
     return self[index]; 
    } 
    set 
    { 
     (IList<Foo>)[index] = value; 
    } 
} 

これは、整数値でインデックスにあなたをできるようになります。 enumを明示的に使用すると、KeyedCollectionの実装に戻ります。

+0

これはチャンピオンのように機能しました、ありがとう! – JadeMason

2

問題は、0は暗黙的にFooTypeに変換可能です。他の番号を使用しても問題ありません。あなたはこのコードを使用している場合、それはあまりにも動作するはずです:

int index = 0; 
Foo myFooByIndex = foo[index]; 

EDIT:残念ながらキャストはここに助けにはならない - コンパイラは、まだ一定の0

+1

私は(int)にキャストしようとしましたが、それでもFooTypeとして解決され、例外がスローされました。 – JadeMason

3

としてそれを認識してここでこれらを回避するために役立つ拡張メソッドです例どこ2つのインデクサが重なっ - キーがintであれば、それも役立ちます:

static class CollectionUtils 
{ 
    public static TValue GetByIndex<TKey,TValue> 
     (this KeyedCollection<TKey, TValue> collection, int index) 
    { 
     return collection[index]; 
    } 
} 

その後、fkc.GetByIndex(0)を呼び出し、それが正常に動作します。ジェネリックメソッドの内部ではのみindexからintインデクサを解決することができます。

+0

個人的に私はこれが最善の解決策だと思います。他のものとは別に、KeyedCollection (Jeffの解決策が落ちる)として使用すると、間違っていないことを意味します。 –

+0

@Jon - 私の考えはまさに;-p –

関連する問題