Xét đoạn mã sau:Sử dụng biến lặp của vòng lặp foreach trong biểu thức lambda - tại sao không thành công?
public class MyClass
{
public delegate string PrintHelloType(string greeting);
public void Execute()
{
Type[] types = new Type[] { typeof(string), typeof(float), typeof(int)};
List<PrintHelloType> helloMethods = new List<PrintHelloType>();
foreach (var type in types)
{
var sayHello =
new PrintHelloType(greeting => SayGreetingToType(type, greeting));
helloMethods.Add(sayHello);
}
foreach (var helloMethod in helloMethods)
{
Console.WriteLine(helloMethod("Hi"));
}
}
public string SayGreetingToType(Type type, string greetingText)
{
return greetingText + " " + type.Name;
}
...
}
Sau khi gọi myClass.Execute()
, mã in các phản ứng bất ngờ sau:
Hi Int32 Hi Int32 Hi Int32
Rõ ràng, tôi mong chờ "Hi String"
, "Hi Single"
, "Hi Int32"
, nhưng dường như nó không phải là trường hợp. Tại sao phần tử cuối cùng của mảng được lặp lại đang được sử dụng trong tất cả 3 phương thức thay vì phương thức thích hợp?
Bạn sẽ viết lại mã để đạt được mục tiêu mong muốn như thế nào?
Tôi thậm chí không đọc câu hỏi, nhưng từ tiêu đề, tôi biết câu trả lời là: http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!689.entry – Brian
Câu hỏi biến được ghi hàng ngày xé đầu xấu xí của nó. – Marc