以下代码无法编译:
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>
这一事实无关紧要。
我错过了什么吗?
答案 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>
,因此不允许这样做。