为什么我得到错误:“不能隐式转换类型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;
            }
        }
    }

为什么我得到错误:“不能隐式转换类型system . collections . generic . list”

您得到编译时错误,因为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)。

_ValuesList<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; }
}

相关文章: