Pergunta

Eu tenho uma coleção que implementa uma interface que estende IList<T> e List.

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

Isso significa que tenho duas versões do indexador.

Desejo que a implementação genérica seja usada, então a implemento normalmente:

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

Eu só preciso da versão IList para serialização, então eu a implemento explicitamente, para mantê-la oculta:

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

No entanto, em meus testes de unidade, o seguinte

MyObject foo = target[0];

resulta em um erro do compilador

A chamada é ambígua entre os seguintes métodos ou propriedades

Estou um pouco surpreso com isso;Acredito que já fiz isso antes e funciona bem.O que estou perdendo aqui?Como posso fazer com que IList<T> e IList coexistam na mesma interface?

Editar IList<T> faz não implementar IList, e eu deve implementar IList para serialização.Não estou interessado em soluções alternativas, quero saber o que estou perdendo.

Edite novamente:Tive que retirar o IList da interface e movê-lo na minha classe.Não quero fazer isso, pois as classes que implementam a interface serão eventualmente serializadas para Xaml, o que requer coleções para implementar IDictionary ou IList...

Foi útil?

Solução

Você não pode fazer isso com

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

Mas você pode fazer o que quiser com uma classe, você precisará tornar explícitas as implementações de uma das interfaces.No meu exemplo, tornei o IList explícito.

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

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

Você já pensou em fazer com que IMySpecialCollection implementasse ISerializable para serialização?O suporte a vários tipos de coleção parece um pouco errado para mim.Você também pode querer converter seu IList para IEnumerable para serialização, já que IList apenas envolve IEnumerable e ICollection.

Outras dicas

Este é um idiota de minha pergunta aqui

Resumindo, se você fizer isso, resolverá o problema:

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

Infelizmente você não pode declarar dois indexadores com a mesma lista de parâmetros.O seguinte parágrafo foi retirado daqui Guia de programação C# – Usando a seção "Comentários" de indexadores:

A assinatura de um indexador consiste no número e nos tipos de seus parâmetros formais.Não inclui o tipo de indexador nem os nomes dos parâmetros formais.Se você declarar mais de um indexador na mesma classe, eles deverão ter assinaturas diferentes.

Você terá que declarar um conjunto diferente de parâmetros se desejar usar o segundo indexador.

Mude sua implementação genérica para...

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

Isto diz explicitamente qual 'isto' é qual.

List<T> implica IList, então é uma má ideia usar ambos na mesma classe.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top