Mam następujące zapieczętowane klasy. Próbuję zwrócić listę jako ReadOnlyCollection
. Próbowałem kilku rzeczy, ale nie rozumiem tego. Więc jak mogę zwrócić lub rzucić listę do kolekcji tylko do odczytu?Dlaczego otrzymuję komunikat o błędzie: "nie można niejawnie przekonwertować typu System.Collections.Generic.List"
public sealed class UserValues
{
private readonly List<UserValue> _Values = new List<UserValue>();
public ReadOnlyCollection<UserValues> Values
{
get
{
return _Values;
}
}
}
Klasa 'Lista' 'object' został jako klasy bazowej. Klasa 'ReadOnlyCollection ' nie jest zatem klasą podstawową, a ponieważ nie zdefiniowano żadnych niejawnych operatorów, nie można po prostu przekonwertować tych dwóch klas w ten sposób. Jeśli chcesz utworzyć nową wartość 'ReadOnlyCollection <>', użyj '_Values.AsReadOnly()'. Jeśli używasz najnowszej wersji .NET (4.5, VS2012), możesz zmienić typ właściwości na interfejs 'IReadOnlyList '. Ponieważ 'List <>' implementuje 'IReadOnlyList <>', nie wymaga to rzutowania. To nie jest tak bezpieczne (jeśli nie ufasz konsumentom swojej klasy). –
Zdeterminowany konsument mógłby użyć odbicia, aby uzyskać obraz "IList" owinięty przez 'ReadOnlyCollection ' ', nie ma zbyt wiele rzeczy, które możesz zrobić, aby powstrzymać kogoś przed wprowadzeniem w błąd w twoich zajęciach, jeśli naprawdę, naprawdę chcą . Sądzę, że jeśli są * zdeterminowani złamać rzeczy, znajdą sposób, więc nie warto martwić się zbytnio. –
Próbowałem robić _Values.AsReadOnly() jak wspomniano Jeppe i uzyskać dokładnie ten sam błąd kompilatora. Używam tylko vs2008, więc nie mam dostępu do interfejsu, o którym wspomniał. – Debbie