Wie zu lösen, rufen Sie die Mehrdeutigkeit zwischen einem Generikum.IList<T>.diese[] und IList.diese[]?

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

Frage

Ich habe eine Sammlung, die eine Schnittstelle implementiert, erweitert IList<T> und die Liste.

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

Das bedeutet, dass ich zwei Versionen der indexer.

Ich wünschte, die generische Implementierung zu benutzen, damit ich implementieren, dass man normalerweise:

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

Ich brauche nur die die IList-version für die Serialisierung, also implementiere ich es ausdrücklich, halten Sie es versteckt:

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

Jedoch, in meiner unit-tests, die folgenden

MyObject foo = target[0];

führt zu einem compiler-Fehler

Der Aufruf ist mehrdeutig, zwischen den folgende Methoden oder Eigenschaften

Ich bin ein bisschen überrascht;Ich glaube, ich habe es getan, bevor und es funktioniert gut.Was vermisse ich hier?Wie bekomme ich IList<T> und IList koexistieren innerhalb des gleichen Schnittstelle?

Bearbeiten IList<T> tut nicht IList implementieren, und ich muss IList implementieren, für die Serialisierung.Ich bin nicht daran interessiert, workarounds, ich will wissen, was ich bin fehlt.

Edit nochmal:Ich habe die Tropfen IList von der Oberfläche und bewegen Sie es auf meine Klasse.Ich will nicht, dies zu tun, als Klassen, die das interface implementieren, sind irgendwann auch serialisiert werden, um Xaml, die erfordert, Sammlungen zu implementieren, IDictionary oder IList...

War es hilfreich?

Lösung

Sie können dies nicht mit

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

Aber Sie können tun, was Sie mit einer Klasse wollen, müssen Sie die Implementierungen für eine der Schnittstellen explizit machen. In meinem Beispiel habe ich IList explizit.

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

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

Haben Sie darüber nachgedacht mit IMySpecialCollection ISerializable für die Serialisierung implementieren? mehrere Sammlungstypen Supporting scheint ein wenig falsch zu mir. Sie können auch bei Gießen yout IList IEnumerable für die Serialisierung suchen, da IList nur IEnumerable und ICollection wickelt.

Andere Tipps

Dies ist eine Betrogene von hier

Um es zusammenzufassen, wenn Sie dies tun, löst es das Problem:

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

Leider kann man nicht zwei Indexer mit der gleichen Parameterliste deklarieren. Der folgende Absatz wird von hier genommen # -Programmierhandbuch C - Indexer Abschnitt "Hinweise" Verwendung:

  

Die Signatur eines Indexers besteht aus der Anzahl und Typen ihrer formalen Parameter. Es beinhaltet nicht den Indexer-Typen oder die Namen der formalen Parameter. Wenn Sie mehr als einen Indexer in der gleichen Klasse deklarieren, müssen sie unterschiedliche Signaturen haben.

Sie werden einen anderen Satz von Parametern deklarieren, wenn Sie die zweite Indexer verwenden möchten.

Ändern Sie Ihre generische Implementierung zu ...

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

Diese ausdrücklich sagt, die 'this' ist der.

Liste impliziert IList, also ist es eine schlechte Idee, beide in der gleichen Klasse zu verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top