반복자 변수를 사용하는 람다 표현식의 예기치 않은 동작
주어진 코드에서 myClass.Execute()를 호출할 때 예상되는 출력은 "Hi"입니다. 문자열", "안녕 싱글", "안녕 Int32." 그러나 코드는 "Hi Int32"를 세 번 인쇄합니다. 예상치 못한 동작이 발생하는 이유는 무엇이며 어떻게 해결할 수 있나요?
문제는 foreach 루프 내에서 사용되는 람다 표현식에 있습니다.
var sayHello = new PrintHelloType(greeting => SayGreetingToType(type, greeting));
이 코드에서 루프 변수 유형은 다음과 같습니다. 람다 표현식으로 캡처되었습니다. 그러나 캡처되는 것은 특정 반복의 유형 값이 아니라 변수 자체에 대한 참조입니다.
따라서 나중에 PrintHelloType 대리자가 호출되면 끝에 있는 유형의 값을 사용합니다. 루프는 "Int32"입니다. 이로 인해 예기치 않은 결과가 발생합니다.
해결책:
원하는 목표를 달성하려면 새 변수를 사용하여 각 반복 중에 유형 값을 캡처할 수 있습니다.
foreach (var type in types) { var newType = type; var sayHello = new PrintHelloType(greeting => SayGreetingToType(newType, greeting)); helloMethods.Add(sayHello); }
이제 각 람다 표현식은 특정 반복에 대한 올바른 값인 newType의 값을 캡처합니다. 그러면 예상되는 출력인 "Hi String", "Hi Single", "Hi Int32"가 생성됩니다.
위 내용은 람다 식이 foreach 루프의 각 반복 동안 해당 값 대신 반복기 변수의 최종 값을 캡처하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!