2010-02-12 33 views
6

Tôi có một lớp học với một phương pháp quá tải:Gọi mơ hồ với một Lambda trong C# .NET

MyClass.DoThis(Action<Foo> action); 
MyClass.DoThis(Action<Bar> action); 

Tôi muốn vượt qua một biểu thức lambda lên phiên bản Action:

MyClass.DoThis(foo => foo.DoSomething()); 

Thật không may, Visual Studio đúng không thể cho biết sự khác biệt giữa các phiên bản Action<Foo>Action<Bar>, do suy luận kiểu xung quanh biến "foo" - và do đó nó làm tăng lỗi trình biên dịch:

The call is ambiguous between the following methods or properties: 'MyClass.DoThis(System.Action <Foo>)' and 'MyClass.DoThis(System.Action <Bar>)'

Cách tốt nhất để giải quyết vấn đề này là gì?

Trả lời

23
MyClass.DoThis((Foo foo) => foo.DoSomething()); 
2

Không có cách nào mà trình biên dịch có thể tự tìm ra. Cuộc gọi thực sự là mơ hồ và bạn sẽ phải bằng cách nào đó làm rõ quá tải bạn muốn cho trình biên dịch. Tên tham số "foo" không đáng kể ở đây trong độ phân giải quá tải.

MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething())); 
0

Con đường tôi biết là sử dụng một đại biểu kiểu cũ:

MyClass.DoThis(delegate(Foo foo) { 
    foo.DoSomething(); 
}); 

này là rất nhiều tiết hơn một lambda. Tôi cũng lo ngại rằng nó có thể không hoạt động nếu yoiu muốn một cây biểu hiện, mặc dù tôi không chắc chắn về điều này.

Các vấn đề liên quan