"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso alcançar um comportamento covariante com acesso indexado nas coleções .NET?

Como posso alcançar um comportamento covariante com acesso indexado nas coleções .NET?

Postado em 2025-02-10
Navegar:709

How Can I Achieve Covariant Behavior with Indexed Access in .NET Collections?

compreensão de covariância e ilista limitações

covariância é um princípio na programação em que um tipo de referência pode ser atribuído a uma variável de uma base ou interface tipo. No entanto, isso representa um dilema quando se trata de coleções, especificamente quando consideramos a interface ilist. Infelizmente, as coleções .NET embutidas como List implementam os indexadores GET e Set, o que os impede de serem totalmente covariantes. ]

apesar dessa limitação, existem maneiras de alcançar um comportamento covariante, mantendo o acesso indexado.

1. ReadOnLyCollections (do .NET 4.5 em diante)

iradonlyList e iradonlycollection são interfaces covariáveis ​​introduzidas no .net 4.5. Eles só têm um indexador, tornando -os adequados para cenários covariantes. List e READONLYCOLLECÇÃO Implementar ambas as interfaces.

2. Wrapper personalizado

se você precisar de uma coleção covariant com acesso indexado nas versões anteriores do .NET, você pode criar uma classe de wrapper. A classe Wrapper encapsularia um ilista e apenas exporia o indexador e as interfaces . T>:

public estática de covariância estática { public static iindexedenumerable ascovariant (esta cauda ilist ) { devolver novo covarianista (cauda); } Classe privada covarianista : IIndexedEnumerable { Private readonly ilist cauda; public covarianist (ilist cauda) { this.tail = cauda; } public t este [int index] {get {return cauda [index]; }} public ienumerator getenumerator () {return caud.getenumerator ();} Ienumerator ienumerable.getenumerator () {return caud.getenumerator (); } public int count {get {return caud.count; }} } } Interface pública IIndexedEnumerable : Ienumerable { T este [int index] {get; } int count {get; } }

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3