Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';变量协方差与参数无关?_C#_.net_Covariance_Contravariance - Fatal编程技术网

C# 为什么';变量协方差与参数无关?

C# 为什么';变量协方差与参数无关?,c#,.net,covariance,contravariance,C#,.net,Covariance,Contravariance,以下代码未编译: public void CreateStringList(out List<string> newList) { newList = new List<string>(); } ... IEnumerable<string> myList; CreateStringList(out myList); public void CreateStringList(out List newList) { newList=新列表(); }

以下代码未编译:

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

...

IEnumerable<string> myList;
CreateStringList(out myList);
public void CreateStringList(out List newList)
{
newList=新列表();
}
...
可数myList;
CreateStringList(超出myList);
给出的错误是:

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

我的问题是为什么不起作用?
IEnumerable
列表
是协变的,因此赋值永远不会违反类型安全性。在赋值之前,不允许使用
out
参数,因此
newList
的前一个值可能不是
列表
这一事实是不相关的

我遗漏了什么吗?

引用了一个非常类似的问题():

“out”和“ref”之间的唯一区别是编译器 禁止在out参数被指定之前读取该参数 并且编译器需要在被调用方之前赋值 正常返回


这意味着C#以外的语言没有这种限制,可以使用参数作为输入。由于
IEnumerable
不能是
列表
,因此这是不允许的。

重复此项不起作用与
out
无关,请特别参见Eric对链接问题的回答中的“结论4”。只是一个小提示:当进行否决表决时,请发表评论,以便改进/更正答案。可能是因为Eric的回答明确指出了这一点,并且没有必要暗示:“使用C#以外的.NET语言编写此接口实现的人可以在初始化该项之前读取该项,因此可以将其用作输入。”