Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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# 当IList by ref是方法签名时,按ref传递列表_C#_List_Ilist - Fatal编程技术网

C# 当IList by ref是方法签名时,按ref传递列表

C# 当IList by ref是方法签名时,按ref传递列表,c#,list,ilist,C#,List,Ilist,我对下面的代码有问题。我希望我的方法采用IList,而不是列表,但我是否被误导了 以下是我的方法: public void DoFoo( ref IList<Foo> thingy) {} public void DoFoo(ref-IList thingy){ 以下是声明和电话: var foo = new List<Foo>(); DoFoo( ref foo) var foo=newlist(); DoFoo(参考foo) 为什么不编译?如果是的话,foo肯

我对下面的代码有问题。我希望我的方法采用IList,而不是列表,但我是否被误导了

以下是我的方法:

public void DoFoo( ref IList<Foo> thingy) {}
public void DoFoo(ref-IList thingy){
以下是声明和电话:

var foo = new List<Foo>();
DoFoo( ref foo)
var foo=newlist();
DoFoo(参考foo)

为什么不编译?如果是的话,foo肯定会实现IList,因为编译必须从列表强制转换到IList?

类型推断在这里遇到了障碍。
var
相当于直接声明一个
列表
,但是您需要一个
IList
。您必须在声明中显式地编写所需的类型

IList<foo> foo = new List<Foo>();
DoFoo( ref foo)
IList foo=new List();
DoFoo(参考foo)

它不编译的原因是
ref
允许该方法执行以下操作:

public void DoFoo( ref IList<Foo> thingy)
{
    thingy = new Foo[10];
}
public void DoFoo(参考IList thingy)
{
thingy=新富[10];
}
数组实现了
IList
,但它们不是
List
,这就是编译器拒绝编译代码的原因

您有一个引用特定类型变量的参数,在本例中为
List
,并且您不能将其他类型的集合填充在其中,除非它们继承自
List

有一种方法可以避免这种情况,只需将列表复制到正确类型的变量,但还需要确定如果该方法实际替换该变量的内容会发生什么

换句话说,您可以这样做:

IList<Foo> il = foo;
DoFoo(ref il);
// what if il is a new reference here now?
IList il=foo;
多福(参考il);
//如果il现在是一个新的参考呢?

正如在另一个答案中已经提到的,对象(以及本例中的列表)已经是引用。您确定首先需要
ref
?让我澄清一下。NET中的对象是引用类型,这意味着您将引用传递给该对象。使用
ref
参数可以通过引用传递参数,这是不同的


传递引用允许该方法访问与外部世界相同的对象。通过引用传递允许方法在外部世界访问变量。

var foo=new List()作为IList首先,为什么在那里有一个
ref
?另请参见。但拉西是对的;这个代码几乎肯定是错误的。如果要传递列表,请传递对列表的引用,而不是对列表类型的变量的引用。前者是
IList
,后者是
ref-IList
;这个问题的正常解决方法是使用
public-IList-DoFoo(IList-thingy){}
然后使用
IList-foo=new-List();foo=DoFoo(foo)。但是仍然很难看。正如另一个答案所说,通过引用传递和通过值传递引用类型是不一样的。默认行为是按值传递。我知道。这就是为什么我回答了这个问题,但我也想知道
ref
的目的是什么。我想你会知道,但我要澄清的是,因为你的“对象(以及本例中的列表)已经通过引用传递了”行。啊,明白你的意思了,现在重写这一段。