为什么我得到错误:“不能隐式转换类型system . collections . generic . list”
本文关键字:system 类型 转换 collections generic list 错误 不能 为什么 | 更新日期: 2023-09-27 18:12:25
我有以下密封类。我试图返回列表作为ReadOnlyCollection
。我试了几样东西,但还是没有找到窍门。那么,如何将列表返回或强制转换为只读集合呢?
public sealed class UserValues
{
private readonly List<UserValue> _Values = new List<UserValue>();
public ReadOnlyCollection<UserValues> Values
{
get
{
return _Values;
}
}
}
您得到编译时错误,因为List<UserValue>
是而不是 ReadOnlyCollection<UserValue>
,也不是隐式转换为该。(我想你是指ReadOnlyCollection<UserValue>
而不是ReadOnlyCollection<UserValues>
顺便说一下?)
这可能是最简单的使用List<T>.AsReadOnly
-但你不妨只创建一次:
public sealed class UserValues
{
private readonly List<UserValue> values = new List<UserValue>();
private readonly ReadOnlyCollection<UserValue> valuesView;
public UserValues()
{
valuesView = values.AsReadOnly();
}
public ReadOnlyCollection<UserValues> Values { get { return valuesView; } }
}
ReadOnlyCollection<T>
实际上只是一个视图-因此对底层集合的更改将通过视图可见。
尝试:
return new ReadOnlyCollection<UserValue>(_Values);
编辑:考虑到你对Jon说的话,你的代码没有意义。您的get
引用了List<UserValue>
类型,但您想将其转换为ReadOnlyCollection<UserValues>
类型,这是无法做到的-这是2种不同类型的2个集合。
我们需要更多的信息来帮助你回答这个问题。您希望您的UserValues
类返回UserValues
类型的集合,还是UserValue
类型的集合?您的代码暗示UserValue
,但您的后续注释状态UserValues
。你确定你的主管没有打错字吗?
如果没有,则需要一些内部集合,如:
private readonly List<UserValues> _MoreValues = new List<UserValues>();
然后用我(或其他回答过的人——所有给出的答案都可以有效地将List转换为ReadOnlyCollection)所显示的语法返回它。
请注意,我的代码编译目标是。net 3.5,假设类型是兼容的(意思是ReadOnlyCollection<UserValue>
包装List<UserValue>
,或者两者都是UserValues
)。
_Values
是List<UserValue>
,而不是ReadOnlyCollection<UserValue>
(它们不相关,就编译器所知),所以您不能直接返回_Values
。您可以从列表中创建一个ReadOnlyCollection<T>
并返回它,如:
private List<UserValue> _Values = [whatever];
private ReadOnlyCollection<UserValue> _ValuesWrapper;
public UserValues()
{
_ValuesWrapper = _Values.AsReadOnly();
}
public ReadOnlyCollection<UserValue> Values
{
get { return _ValuesWrapper; }
}
…或者,如果你只是在寻找一种只读的方式来访问你的集合,而不是特别需要一个ReadOnlyCollection<UserValue>
对象,你可以改变你的属性来返回一个List<T>
实现的只读接口,你的应用程序可以使用它来代替。net 4.5引入了一些只读集合接口,非常棒对于这种事情:
public IReadOnlyList<UserValue> Values
{
get { return _Values; }
}