2008-09-11 14 views
7

Tengo una colección que implementa una interfaz que amplía IList < T> y Lista.Cómo resolver la ambigüedad de la llamada entre Generic.IList <T> .this [] e IList.this []?

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

Eso significa que tengo dos versiones del indexador.

deseo de la aplicación genérica para ser utilizado, por lo que implemento que uno normalmente:

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

solo me falta la versión IList para la serialización, así que lo apliquen de manera explícita, a mantenerlo oculto:

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

Sin embargo, en mis pruebas de unidad, la siguiente

MyObject foo = target[0]; 

resultados en un com apiladora de error

La llamada es ambigua entre las siguientes métodos o propiedades

Estoy un poco sorprendido por esto; Creo que lo he hecho antes y funciona bien. ¿Que me estoy perdiendo aqui? ¿Cómo puedo obtener IList < T> y IList para que coexistan dentro de la misma interfaz?

Editar IList < T> hace no implemento IList, y yo debe aplicar IList para la serialización. No estoy interesado en soluciones alternativas, quiero saber lo que me estoy perdiendo.

Editar nuevamente: Tuve que quitar IList de la interfaz y moverlo a mi clase. No quiero hacer esto, ya que las clases que implementan la interfaz eventualmente se serializarán en Xaml, lo que requiere que las colecciones implementen IDictionary o IList ...

+0

¿Puedo preguntar cómo estás serializar un indexador de encargo? Cuando traté de indexar un indexador personalizado (para WCF), recibí un mensaje ASP de pantalla amarilla de muerte que decía que los indexadores personalizados no pueden ser serializados. Finalmente abandoné la idea. –

Respuesta

3

No se puede hacer esto con

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

Pero se puede hacer lo que quiera con una clase, se tendrá que hacer las implementaciones de una de las interfaces explícitas. En mi ejemplo, hice IList explícito.

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

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

¿Usted ha considerado tener IMySpecialCollection implementar ISerializable para la serialización? El soporte de múltiples tipos de colecciones me parece un poco incorrecto. También es posible que desee ver lanzar su IList a IEnumerable para la serialización ya que IList simplemente ajusta IEnumerable e ICollection.

+1

+1 para darse cuenta de que este error ocurre cuando se usa una interfaz pero no una clase. 0 para ISerializable + Xaml: P – Lucas

-1

Lista < T implica implícita IList, por lo que es un error idea de usar ambos en la misma clase.

+1

IList no implementa IList. Y necesito implementar IList para fines de serialización. – Will

1

Desafortunadamente no puede declarar dos indizadores con la misma lista de parámetros. El siguiente párrafo se toma desde aquí C# Programming Guide - Using Indexers "Remarks" section:

La firma de un indexador consiste en el número y los tipos de sus parámetros formales. No incluye el tipo de indexador ni los nombres de los parámetros formales. Si declara más de un indexador en la misma clase, debe tener firmas diferentes.

Deberá declarar un conjunto diferente de parámetros si desea utilizar el segundo indexador.

+1

No puede tener 2 indexadores 'esto', pero puede tener una 'cadena IDataErrorInfo.this' y una 'T IList . This'. Tendrá que lanzar el objeto antes de acceder al indexador, pero funciona. –

-1

Cambiar la implementación genérica a ...

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

Esto dice explícitamente qué 'esto' es cuál.

+0

con ambos implementado explícitamente, necesita lanzar la lista para usar cualquiera de los dos, que no es lo que él quiere. él quiere usar el genérico por defecto y esconder el no genérico. – Lucas

2

Esta es una víctima de my question here

En resumen, si usted hace esto, se resuelve el problema:

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