【发布时间】:2013-05-05 20:20:51
【问题描述】:
我有以下密封类。我正在尝试将列表作为ReadOnlyCollection 返回。尝试了几件事,但我不明白这一点。那么如何将列表返回或强制转换为只读集合?
public sealed class UserValues
{
private readonly List<UserValue> _Values = new List<UserValue>();
public ReadOnlyCollection<UserValues> Values
{
get
{
return _Values;
}
}
}
【问题讨论】:
-
类
List<UserValue>有object作为它的基类。因此,ReadOnlyCollection<UserValue>类不是基类,并且由于未定义隐式运算符,因此您不能像那样在这两个类之间进行转换。如果要创建新的ReadOnlyCollection<>,请使用_Values.AsReadOnly()。如果你使用最新的.NET版本(4.5,VS2012),可以将属性类型改为接口IReadOnlyList<UserType>。由于List<>实现了IReadOnlyList<>,因此不需要强制转换。它没有那么安全(如果您不信任您班级的消费者)。 -
一个坚定的消费者也可以使用反射来获取由
ReadOnlyCollection<T>包裹的IList<T>,但是,如果有人弄乱你的类的内部,你无能为力真的,真的很想。我想如果他们那决心破坏事物,他们会找到办法的,所以不必太担心。 -
我尝试像 Jeppe 提到的那样做 _Values.AsReadOnly() 并得到完全相同的编译器错误。而且我只用vs2008,所以无法访问他提到的界面。