Domanda

Ho una collezione che implementa un'interfaccia che si estende a IList<T> e nell'Elenco.

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

Questo significa che ho due versioni dell'indicizzatore.

Vorrei implementazione generica per essere utilizzato, in modo da implementare che uno normalmente:

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

Ho solo bisogno IList versione per la serializzazione, in modo da implementare in modo esplicito, di tenerlo nascosto:

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

Tuttavia, nel mio test di unità, il seguente

MyObject foo = target[0];

i risultati di un errore del compilatore

La chiamata è ambiguo tra il seguenti metodi o proprietà

Io sono un po ' sorpreso di questo;Credo di aver fatto prima e funziona benissimo.Quello che mi manca qui?Come posso ottenere IList<T> e IList a coesistere all'interno della stessa interfaccia?

Modifica IList<T> non non implementare IList, e ho deve implementare IList per la serializzazione.Io non sono interessato a soluzioni alternative, voglio sapere cosa mi manca.

Edit di nuovo:Ho dovuto eliminare IList dall'interfaccia e spostarla nella mia classe.Io non voglio fare questo, come le classi che implementano l'interfaccia sono finalmente andando essere serializzato in Xaml, che richiede collezioni di implementare IDictionary o IList...

È stato utile?

Soluzione

Non si può fare questo con

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

Ma si può fare quello che si vuole con una classe, è necessario fare le implementazioni per una delle interfacce esplicite.Nel mio esempio ho fatto IList esplicito.

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

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

Avete considerato la possibilità di avere IMySpecialCollection implementare ISerializable per la serializzazione?Supporto per più tipi di raccolta sembra un po ' sbagliato per me.Si potrebbe anche voler guardare casting yout IList a IEnumerable per la serializzazione dal IList solo impacchi IEnumerable e ICollection.

Altri suggerimenti

Questo è un dupe di la mia domanda qui

Per riassumere, se si esegue questa operazione, si risolve il problema:

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

Purtroppo non è possibile dichiarare due indicizzatori con lo stesso elenco di parametri.Il seguente paragrafo è tratto da qui Guida per programmatori C# - Utilizzo di Indicizzatori sezione "Osservazioni" :

La firma di un indicizzatore compone il numero e il tipo dei suoi parametri formali.Non include l'indicizzatore di tipo o i nomi dei parametri formali.Se si dichiara più di un indicizzatore nella stessa classe, devono avere firme diverse.

Si dovrà dichiarare un diverso insieme di parametri, se si desidera utilizzare la seconda indicizzatore.

Cambiare la vostra generico implementazione di...

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

Questo dice esplicitamente che 'questo' è che.

Elenco<T> implica IList, quindi è una cattiva idea utilizzare entrambi nella stessa classe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top