내가 여기 무슨 일이 일어나고 있는지 현상을 알고 싶습니다 :
이 목록에 List<string>
변환 동일한 문자열을 반환하는 대리자가 잘못되었습니다.
입력 목록에서 foreach
에 의해 반환되는 변수로 직접 작업 할 때 WrongConversion
에서 발생합니다. 내가 먼저 로컬 변수를 할당하고 위임에 그를 사용 CorrectConversion
에서
(목록에서 마지막 문자열마다 반환됩니다).
이 과제는 처음에는 불필요한 것처럼 보입니다.
입력 :
using System.Collections.Generic;
class Program
{
delegate string StringReturner();
static void Main(string[] args)
{
var list = new List<string> { "a", "b", "c" };
Display(WrongConversion(list));
Display(CorrectConversion(list));
System.Console.ReadKey();
}
static List<StringReturner> WrongConversion(List<string> list)
{
var result = new List<StringReturner>();
foreach (var s in list)
{
result.Add(() => { return s; }); // <========= s is always "c" ?
}
return result;
}
static List<StringReturner> CorrectConversion(List<string> list)
{
var result = new List<StringReturner>();
foreach (var s in list)
{
var localString = s; // <========= What happens here?
result.Add(() => { return localString; });
}
return result;
}
private static void Display(List<StringReturner> list)
{
foreach (var stringReturner in list)
System.Console.Write(stringReturner());
System.Console.WriteLine();
}
}
출력 :
ccc
abc
백만 개의 질문이 중복되어 있습니다. 그것은 지역 변수를 닫는 것과 관련이 있습니다. – jason