为什么我不能返回List <list <int>&gt;类型的变量?对于具有IList <ilist <int>&gt;的函数C#中的返回类型

时间:2015-08-20 18:23:10

标签: c# interface covariance

public IList<IList<int>> FunctionName(...)
{
    var list = new List<List<int>>();
    ...
    //return list;                      // This doesn't compile (error listed below)
    return (IList<IList<int>>)list;     // Explicit cast compiles
}

当我返回&#34;列表&#34;直接,我得到这个错误:

> "Cannot implicitly convert type
> 'System.Collections.Generic.List<System.Collections.Generic.List<int>>'
> to
> 'System.Collections.Generic.IList<System.Collections.Generic.IList<int>>'.
> An explicit conversion exists (are you missing a cast?)"

接口返回类型是否不接受任何派生实例?

1 个答案:

答案 0 :(得分:6)

有一个微妙的类型错误。如果这样做有效,你就有可能发生这类错误。

List<List<int>> list = new List<List<int>>();
IList<IList<int>> ilist = list;  // imagine a world where this was legal

// This is already allowed by the type system
ilist.Add(new int[] { 1, 2, 3 });

// This is actually an array! Not a List<>
List<int> first = list[0];

您可以使用IReadOnlyList<>来满足您的要求。由于它是只读的,因此该类型错误无法在代码中显示。但是你永远不能在外部列表中添加元素或更新值。通用接口的这一特性称为&#34;协方差&#34;。

IReadOnlyList<IList<int>> ilist = list;