Mam problem z FxCop warning CA1006, Microsoft.Design "DoNotNestGenericTypesInMemberSignatures". W szczególności projektuję klasę ReportCollection<T>
, która dziedziczy po ReadOnlyCollection<Report<T>>
, a jej konstruktor public
przyjmuje jako parametr IList<Report<T>>
.Czy są jakieś dobre obejścia dla ostrzeżenia FxCop CA1006?
Sugestia do mocowania to ostrzeżenie nie jest bardzo przydatne:
„Aby naprawić naruszenie tej zasady, zmienić projekt, aby usunąć zagnieżdżony typ argumentu”. Istnieją dwa sposoby widzę tak daleko, aby zmienić wygląd jak sugeruje:
- Złóż konstruktora
internal
. To nie działa w moim przypadku. Konstruktor musi byćpublic
, ponieważ ta klasa kolekcji musi być możliwa do przypisania przez kod spoza zestawu. - Zmodyfikuj konstruktora jako
Report<T>[]
zamiastIList<Report<T>>
. Jest to nieoptymalne, ponieważ kod zewnętrzny powinien mieć elastyczność korzystania z dynamicznych struktur danych, takich jakList<T>
zamiast macierzy o ustalonych rozmiarach.
W tym momencie podałem i ukryłem to ostrzeżenie. Czy istnieje lepsze rozwiązanie?
Nie wprowadziłbym żadnego ograniczenia "bezpiecznego" poziomu zagnieżdżenia. Typy ogólne powinny być zagnieżdżone, jednak dogłębnie wymagają tego semantyki. Ograniczenia w obsłudze interfejsów dla kowariancji i kontrawariancji oznaczają, że kod, który oczekuje np. 'IDictionary>' nie będzie w stanie zaakceptować 'IDictionary >', ale gdy zagnieżdżone generics są semantycznie poprawne, wolałbym raczej używać ich zamiast próbować obejść je. –
supercat