【问题标题】:Why doesn't covariance work with out parameters?为什么协方差不适用于 out 参数?
【发布时间】:2014-12-14 01:07:41
【问题描述】:

以下代码无法编译:

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

...

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

给出的错误是:

out参数类型与参数类型不匹配

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

我错过了什么吗?

【问题讨论】:

标签: c# .net covariance contravariance


【解决方案1】:

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

“out”和“ref”的唯一区别是编译器 禁止在输出参数被分配之前读取它 被调用者,并且编译器需要在被调用者之前赋值 正常返回。

这意味着 C# 以外的语言没有此限制,并且可以使用参数作为输入。由于IEnumerable&lt;string&gt; 不能是List&lt;string&gt;,因此这是不允许的。

【讨论】:

  • 只是一个小提醒:当反对票时,请发表评论,以便改进/纠正答案。
  • 也许是因为 Eric 的回答明确指出了这一点,并且没有必要暗示:“使用 C# 以外的 .NET 语言编写此接口的实现的人将能够在项目出现之前读取它已初始化,因此可以用作输入。”
猜你喜欢
  • 2012-02-13
  • 2013-04-10
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多