2010-02-12 51 views
6

我有一個重載方法的類:曖昧通話用LAMBDA在C#.NET

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

我想lambda表達式傳遞給動作版本:

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

不幸的是,視覺Studio由於圍繞「foo」變量的類型推斷而無法區分Action<Foo>Action<Bar>版本之間的區別,因此會引發編譯器錯誤:

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

解決此問題的最佳方法是什麼?

回答

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

編譯器沒有辦法自己弄清楚。這個調用確實是不明確的,你必須以某種方式澄清你想要編譯器的過載。在重載分辨率中,參數名稱「foo」在這裏不重要。

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

我所知道的方法是使用老式的委託:

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

這是很多比拉姆達更詳細。我也擔心,如果yoiu想要表達樹,這可能不是工作,儘管我不確定這一點。