가 컴파일되지 않는 이유는 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
매개 변수를 사용하면 참조 번호으로 매개 변수를 전달할 수 있습니다.
참조를 전달하면 메서드가 외부 세계와 동일한 객체에 액세스 할 수 있습니다. 을 참조로 전달하면 메서드가 외부에서 변수 에 액세스 할 수 있습니다.
왜 처음에는 거기에 '참조'가 있습니까? –
http://blogs.msdn.com/b/ericlippert/archive/2009/09/21/why-do-ref-and-out-parameters-not-allow-type-variation.aspx를 참조하십시오. 하지만 Lasse가 옳다. 이 코드는 거의 틀린 것입니다. 목록을 전달하려면 list * 유형의 변수에 대한 참조가 아닌 * 목록에 * 참조를 전달하십시오. 전자는'IList'이고, 후자는'ref IList '이다. 그들은 매우 다릅니다. –
이 문제의 정상적인 해결책은 대신'public IList DoFoo (IList thingy) {}'를 사용하고 'IList foo = new List (); foo = DoFoo (foo);'를 사용하는 것입니다. 그래도 추한. –
Brian