2010-10-26 42 views
27

Tôi đang làm gì sai ở đây? Tôi có thể thực hiện hành động của mình bằng cách nào?Gọi đệ quy - Hành động lambda

var recurse = new Action<IItem, Int32>((item, depth) => 
{ 
    if (item.Items.Count() > 0) recurse(item, depth + 1); // red squiggly here 

    // ... 
}); 

Tôi nhận được một màu đỏ nguệch ngoạc khi gọi recurse nói "phương pháp, đại biểu hoặc sự kiện dự kiến".


Cập nhật

Tôi đã chấp nhận câu trả lời của Sao Homam. Tôi chỉ muốn thêm/chia sẻ một cú pháp cho cùng ... Nhưng mà tôi tìm thấy dễ dàng hơn một chút trên mắt ...

Action<IEnumerable<Item>> Recurse = null; 

Recurse = item => 
{ 
    if (item.Items != null) Recurse(item.Items); 

    // ... 
}; 

Trả lời

48

Chỉ cần xác định các đại biểu Action và gán null để nó trước khi gọi nó đệ quy.

Action<IItem, Int32> recurse = null; 

Sau đó

recurse = new Action<IItem, Int32>((item, depth) => 
{ 
    if (item.Items.Count() > 0) recurse(item, depth + 1); // red squiggly here 
    // ... 
}); 

Chúc may mắn!

+0

Tôi ghét phải phân tách định nghĩa và triển khai. Có cách nào tôi có thể làm điều này trong một dòng mã? – roosteronacid

+6

Không. Eric giải thích lý do tại sao trong mục nhập blog của anh ấy (bình thường nó xuất hiện): http://blogs.msdn.com/b/ericlippert/archive/2006/08/18/706398.aspx –

+0

@Ron: Nice tidbit. Làm cho một số loại cảm giác kỳ lạ :) – roosteronacid