Generic.IList<T>.this[] と IList.this[] の間の呼び出しの曖昧さを解決するにはどうすればよいですか?
質問
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 を暗黙的に示すため、同じクラスで両方を使用することはお勧めできません。