7

IList<T> と List の両方を拡張するインターフェイスを実装するコレクションがあります。

public Interface IMySpecialCollection : IList<MyObject>, IList { ... }

つまり、2 つのバージョンのインデクサーがあるということです。

一般的な実装を使用したいので、通常どおり実装します。

public MyObject this[int index] { .... }

シリアライゼーションには IList バージョンのみが必要なので、明示的に実装して隠しておきます。

object IList.this[int index] { ... }

ただし、私の単体テストでは、次の

MyObject foo = target[0];

コンパイラ エラーが発生する

次のメソッドまたはプロパティ間の呼び出しがあいまいです

これには少し驚いています。私は以前にそれをやったと信じており、うまく機能しています。ここで何が欠けていますか?IList<T> と IList を同じインターフェイス内に共存させるにはどうすればよいですか?

Edit IList<T> はIList を実装していないため、シリアル化のために IList を実装する必要があります。回避策には興味がありません。不足しているものを知りたいです。

もう一度編集: インターフェイスから IList を削除して、クラスに移動する必要がありました。インターフェイスを実装するクラスは最終的に Xaml にシリアル化されるため、IDictionary または IList を実装するコレクションが必要になるため、これを行いたくありません...

4

5 に答える 5

3

あなたはこれを行うことはできません

public interface IMySpecialCollection : IList<MyObject>, IList { ... }

ただし、クラスで必要なことを行うことができます。インターフェイスの1つの実装を明示的にする必要があります。私の例では、IList を明示的にしました。

public class MySpecialCollection : IList<MyObject>, IList { ... }

IList<object> myspecialcollection = new MySpecialCollection(); IList list = (IList)myspecialcollection;

シリアル化のために IMySpecialCollection に ISerializable を実装することを検討しましたか? 複数のコレクション タイプをサポートすることは、私には少し間違っているように思えます。IList は IEnumerable と ICollection をラップするだけなので、シリアル化のために IList を IEnumerable にキャストすることも検討してください。

于 2008-09-11T17:41:12.837 に答える
2

これはここでの私の質問の重複です

要約すると、これを行うと、問題が解決します。

public Interface IMySpecialCollection : IList<MyObject>, IList
{
    new MyObject this[int index];
    ... 
}
于 2009-11-03T20:25:24.887 に答える
1

残念ながら、同じパラメーター リストで 2 つのインデクサーを宣言することはできません。次の段落は、C# プログラミング ガイド - インデクサーの使用の「備考」セクションから抜粋したものです。

インデクサーのシグネチャは、その仮パラメーターの数と型で構成されます。インデクサーの型や仮パラメーターの名前は含まれません。同じクラスで複数のインデクサーを宣言する場合、それらは異なるシグネチャを持つ必要があります。

2 番目のインデクサーを使用する場合は、別のパラメーター セットを宣言する必要があります。

于 2008-09-11T16:53:18.817 に答える
-1

一般的な実装を次のように変更してください...

T IList<T>.this[int index] { get; set; }

これは、どの「これ」がどれであるかを明示的に示しています。

于 2008-09-11T17:00:40.670 に答える
-2

List<T> は IList を意味するため、同じクラスで両方を使用することはお勧めできません。

于 2008-09-11T16:44:51.583 に答える