2010-02-12 15 views
6

Mam klasy z przeciążonej metody:Niejednoznaczne połączeń z lambda w C# .NET

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

Chcę przekazać wyrażenie lambda do wersji Działanie:

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

Niestety, Visual Studio słusznie nie może stwierdzić różnicy między wersjami Action<Foo> i Action<Bar>, ze względu na wnioskowanie typu otaczające zmienną "foo" - i dlatego powoduje błąd kompilatora:

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

Jaki jest najlepszy sposób obejścia tego?

Odpowiedz

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

Kompilator nie może tego samodzielnie rozwiązać. Połączenie jest rzeczywiście niejednoznaczne i będziesz musiał wyjaśnić przeciążenie, jakiego potrzebujesz dla kompilatora. Nazwa parametru "foo" jest tu nieznaczna w przypadku rozładowania.

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

Sposób wiem jest użycie delegata w starym stylu:

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

To jest dużo bardziej gadatliwy niż lambda. Obawiam się również, że może to nie być praca, jeśli yoiu chce drzewek ekspresji, choć nie jestem tego pewien.