Cómo resolver el problema de la llamada ambigüedad entre lo Genérico.IList<T>.este[] y IList.este[]?

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

Pregunta

Tengo una colección que implementa una interfaz que se extiende tanto IList<T> y de la Lista.

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

Eso significa que tengo dos versiones del indizador.

Me gustaría que la implementación genérica para ser utilizado, así que me implementar que uno normalmente:

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

Sólo necesito el IList versión para la serialización, así que me implementar de manera explícita, para mantenerlo oculto:

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

Sin embargo, en mi unidad de pruebas, el siguiente

MyObject foo = target[0];

resultados en un error del compilador

La llamada es ambiguo entre la siguientes métodos o propiedades

Estoy un poco sorprendido por este;Creo que lo he hecho antes y funciona bien.Lo que me estoy perdiendo aquí?¿Cómo puedo obtener IList<T> y IList a coexistir dentro de la misma interfaz?

Editar IList<T> ¿ no implementar IList, y yo debe implementar IList para la serialización.Yo no estoy interesado en soluciones, quiero saber lo que me falta.

Editar de nuevo:He tenido que bajar IList de la interfaz y se mueven en mi clase.No quiero hacer esto, ya que las clases que implementan la interfaz con el tiempo va a ser serializada en Xaml, que requiere colecciones para implementar IDictionary o IList...

¿Fue útil?

Solución

Usted no puede hacer esto con

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

Pero usted puede hacer lo que desee con una clase, usted tendrá que hacer las implementaciones para uno de los interfaces explícitas.En mi ejemplo he hecho IList explícito.

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

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

Has considerado tener IMySpecialCollection implementar ISerializable para la serialización?Soporte de múltiples tipos de colección parece un poco mal para mí.Usted también puede desear mirar en casting las palmas de IList a IEnumerable para la serialización desde IList sólo envuelve IEnumerable y ICollection.

Otros consejos

Este es un duplicado de mi pregunta aquí

Para resumir, si usted hace esto, se soluciona el problema:

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

Desafortunadamente, usted no puede declarar dos indizadores con la misma lista de parámetros.El siguiente párrafo está tomado de aquí C# Guía de Programación - el Uso de los Indizadores sección "Comentarios" :

La firma de un indizador consiste en el número y los tipos de sus parámetros formales.No incluye el alimentador tipo o los nombres de los parámetros formales.Si se declaran más de un indizador en la misma clase, deben tener diferentes firmas.

Usted tendrá que declarar un conjunto diferente de parámetros si desea utilizar la segunda indizador.

Cambio su implementación genérica para...

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

Este dice explícitamente que 'esto' es que.

Lista<T> implica IList, por lo que es una mala idea usar los dos en la misma clase.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top