为什么我收到错误:“无法隐式转换类型System.Collections.Generic.List”

时间:2013-05-05 20:20:51

标签: c# readonly-collection

我有以下密封课程。我正在尝试将列表作为ReadOnlyCollection返回。尝试了几件事,但我没有掌握这一点。那么如何将列表返回或转换为只读集合呢?

    public sealed class UserValues
    {
        private readonly List<UserValue> _Values = new List<UserValue>();

        public ReadOnlyCollection<UserValues> Values
        {
            get
            {
                return _Values;
            }
        }
    }

3 个答案:

答案 0 :(得分:4)

尝试:

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)。

答案 1 :(得分:3)

您收到编译时错误,因为List<UserValue> a ReadOnlyCollection<UserValue>,也不能隐式转换为ReadOnlyCollection<UserValue>。 (顺便说一下,我假设您的意思是ReadOnlyCollection<UserValues>而不是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; } } } ?)

使用List<T>.AsReadOnly可能最简单 - 但您也可以只创建一次:

ReadOnlyCollection<T>

{{1}}实际上只是一个视图 - 因此通过视图可以看到底层集合的更改。

答案 2 :(得分:2)

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