Come risolvere chiamata ambiguità tra Generici.IList<T>.questo[] e IList.questo[]?
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...
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.