Generic.IList<T>.this[] と IList.this[] の間の呼び出しの曖昧さを解決するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/57054

質問

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 を同じインターフェイス内で共存させるにはどうすればよいですか?

編集 IList<T> は ない IList を実装すると、 しなければならない シリアル化のために IList を実装します。私は回避策には興味がありません。何が足りないのか知りたいのです。

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

役に立ちましたか?

解決

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

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 にキャストすることも検討することをお勧めします。

他のヒント

これはカモです 私の質問はここにあります

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

public Interface IMySpecialCollection : IList<MyObject>, IList
{
    new MyObject this[int index];
    ... 
}

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

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

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

汎用実装を次のように変更します。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top