繁体   English   中英

当IList by ref是方法签名时,通过ref传递List

[英]Passing List by ref when IList by ref is the method signature

我在使用下面的代码时遇到问题。 我希望我的方法采用IList,而不是List但是我被误导了?

这是我的方法:

public void DoFoo( ref IList<Foo> thingy) {}

这是声明和电话:

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

为什么这不会编译? foo肯定实现IList If是因为编译必须从List转换为IList?

类型推断妨碍了这里。 var等效于直接声明List但您想要一个IList 您必须在声明中明确写出预期的类型。

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

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

public void DoFoo( ref IList<Foo> thingy)
{
    thingy = new Foo[10];
}

数组实现IList<T> ,但它们不是List<T> ,这就是编译器拒绝编译代码的原因。

你有一个参数引用一个特定类型的变量,在本例中是List<Foo> ,你不能在其中填充其他类型的集合,除非它们从List<Foo>继承。

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

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

IList<Foo> il = foo;
DoFoo(ref il);
// what if il is a new reference here now?

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

经过参考允许该方法访问相同的对象作为外界。 通过引用传递允许该方法访问外部世界中的变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM