为什么协方差不与参数一起工作?

时间:2014-10-18 16:40:52

标签: c# .net covariance contravariance

以下代码无法编译:

public void CreateStringList(out List<string> newList)
{
    newList = new List<string>();
}

...

IEnumerable<string> myList;
CreateStringList(out myList);

给出的错误是:

  

out参数类型与参数类型

不匹配

我的问题是...... 为什么这不起作用? IEnumerable<string>List<string>协变,因此作业永远不会违反类型安全。并且您在分配之前不允许使用out参数,因此newList的先前值可能不是List<string>这一事实无关紧要。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

引用Eric Lippert's answer一个非常相似的问题(Why can't ref and out parameters be variant?):

  

&#34; out&#34;之间的唯一区别和&#34; ref&#34;就是编译器   禁止在分配之前从out参数中读取   callee,并且编译器需要在被调用者之前进行赋值   正常回归。

这意味着C#以外的语言不具备此限制,并且可以使用该参数作为输入。由于IEnumerable<string>不能是List<string>,因此不允许这样做。