2013-03-31 27 views
5

fMethodAction<Fruit>.C# Hành động trong Foreach

Nhưng khi gọi fMethod, tham số luôn là mục nhập cuối cùng của _Fruits.
Cách giải quyết vấn đề này?

foreach(Fruit f in _Fruits) 
{ 
    field.Add(new Element(f.ToString(),delegate{fMethod(f);})); 
} 
+0

có thể trùng lặp của [Có lý do gì cho việc sử dụng lại biến của C# trong foreach?] (Http://stackoverflow.com/questions/8898925/is-there-a-reason-for-cs- tái sử dụng-of-the-biến-in-a-foreach) – Joey

Trả lời

9

Đây là vấn đề nổi tiếng khi sử dụng mệnh đề đã sửa đổi trong cuộc gọi tạo đại biểu. Thêm biến tạm thời sẽ giải quyết biến:

foreach(Fruit f in _Fruits) 
{ 
    Fruit tmp = f; 
    field.Add(new Element(f.ToString(),delegate{fMethod(tmp);})); 
} 

Vấn đề này được khắc phục trong C# 5 (see Eric Lippert's blog).

+3

Vấn đề này ** là ** cố định trong C# 5.0: http://blogs.msdn.com/b/ericlippert/archive/2009/11/12/closing -over-the-loop-variable -view-toxic.aspx –

+0

@ DasKrümelmonster Rất vui được biết, cảm ơn bạn rất nhiều! – dasblinkenlight

1

Thử sử dụng biến tạm thời.

foreach(Fruit f in _Fruits) 
{ 
    var temp = f; 
    field.Add(new Element(temp.ToString(),delegate{fMethod(temp);})); 
}