Imo, jedyna bzdura jest zakladanie, ze uzytkownik klasy to najgorszy szkodnik i chronienie sie na sile przed tym. IEnumerable<>
jest zdecydowanie wystarczajaca informacja, a argument, ze ktos moze sobie rzutowac i zmieniac jednoczesnie mowiac, ze ReadOnlyCollection<>
nie mozna jest po prostu smieszny. http://ideone.com/xD5K3v
Nie bardziej śmieszny niż Twój przykład z dostępem do "chronionego" typu przez refleksję... przez którą można zrobić (prawie) wszystko. I co to ma udowadniać? Typów powinno się używać adekwatnie do sytuacji i pomyłką jest traktowanie IEnumerable<T> jako alternatywy "tylko do odczytu" dla listy tylko dlatego, że udostępnia mniejszą liczbę metod. Niby można ale nie wykorzystuje się jego potencjału i naraża na nieoptymalne wykorzystanie (wielokrotne wyliczanie). Ten interfejs ma zupełnie inne zastosowanie (enumeartory o których pisałem) i powinien być używany raczej w tym kontekscie:
Widząc prawidłowo zaimplementowaną metodę o sygnaturze:
public IEnumerable<T> GetSomeElements()
{
}
Wiem nie tylko co robi, ale i jak to robi...
Spójż na przykład który podał @kry5, widząc właściwość o takim typie ('Weapons') spodziewałbym się, że dostanę tylko tyle elementów o ile faktycznie zapytam a tam w momencie odwołania jest tworzona i zwracana cała kolekcja elementów... Twój przykład już jest dużo lepszy bo samo Select() zwraca IEnumerable<T> i w takim kontekście jego użycie ma sens.
@somekind dokładnie