2011-11-03 28 views
14

LinqKit có phương pháp mở rộng ForEach cho IEnumerable có xung đột với System.Collections.Generic.IEnumerable.C# phương pháp mở rộng không rõ ràng

Error 4 The call is ambiguous between the following methods or properties: 
'LinqKit.Extensions.ForEach<Domain>(System.Collections.Generic.IEnumerable<Domain>, System.Action<Domain>)' 
and 
'System.Linq.EnumerableExtensionMethods.ForEach<Domain>(System.Collections.Generic.IEnumerable<Domain>, System.Action<Domain>)' 

Làm cách nào để loại bỏ lỗi này?

+5

Một lưu ý phụ - Eric Lippert có một số điểm tuyệt vời về lý do tại sao phương pháp mở rộng 'ForEach' có thể không phải là ý tưởng tốt nhất ... Nó đáng đọc: http://blogs.msdn.com/b/ericlippert/archive /2009/05/18/foreach-vs-foreach.aspx –

+0

Nhắc mới biết, thư viện nào có 'System.Linq.EnumerableExtensionMethods'? – StriplingWarrior

+0

Lý do của @ReedCopsey Lippert là không có thật và phản ánh cách lập trình hàm được gắn vào C#, kém (ví dụ: 'select' thay vì' map', 'aggregate' thay vì' foldl', không có 'foldr' ở tất cả ...). Ngược lại, Scala có một phương thức 'foreach' mặc dù nó có một câu lệnh' for' lặp lại trên các bộ sưu tập ... trên thực tế, vòng lặp 'for' mở rộng đến các lời gọi đến' foreach' (trong số những thứ khác). Scala cho phép một phong cách mã hóa bắt buộc, nhưng theo nhiều cách khác nhau khuyến khích các lập trình viên di chuyển theo hướng một phong cách chức năng khi họ trở nên giàu kinh nghiệm hơn. –

Trả lời

22

Enumerable, trong khuôn khổ, không tuyên bố một phần mở rộng cho ForEach(). Cả hai đều là từ các tham chiếu bên ngoài.

Bạn chỉ nên xem xét sử dụng một trong số chúng - tham chiếu thêm EnumerableExtensionMethods hoặc LinqKit.

(Điều này, btw, là một trong những lý do sử dụng cùng một không gian tên vì khuôn khổ gây ra vấn đề - trong trường hợp này, tác giả của EnumerableExtensionMethods đặt nó trong System.Linq, điều này sẽ gây ra sự cố bất kỳ lúc nào bạn đang sử dụng LINQ và bạn có một cuộc đụng độ không gian tên)

Nếu bạn thực sự cần phải sử dụng phương pháp này, sau đó bạn sẽ phải gọi nó là trực tiếp thay vì sử dụng các phương pháp khuyến nông, ví dụ:.

LinqKit.Extensions.ForEach(collection, action); 

Hoặc:

System.Linq.EnumerableExtensionMethods.ForEach(collection, action); 

Điều đó đang được nói, cá nhân tôi sẽ chỉ sử dụng vòng lặp foreach để xử lý các phần tử.

0

Bạn chỉ cần đủ điều kiện cho phương thức mà bạn đang gọi, như trong thông báo lỗi.

Vì vậy, thay vì sử dụng

ForEach<Domain>(...); 

sử dụng

LinqKit.Extensions.ForEach<Domain>(...); 
Các vấn đề liên quan