У меня есть класс с перегруженным методом:
MyClass.DoThis(Action<Foo> action);
MyClass.DoThis(Action<Bar> action);
Я хочу передать лямбда-выражение версии Действия:
MyClass.DoThis( foo => foo.DoSomething() );
К сожалению, Visual Studio справедливо не может сказать различие между Action<Foo>
и Action<Bar>
версии, из-за вывода типа, окружающего переменную "нечто" - и таким образом, это повышает ошибку компилятора:
Вызов неоднозначен между следующими методами или свойствами: 'MyClass. DoThis (Система. Действие
<Foo>
)' и 'MyClass. DoThis (Система. Действие<Bar>
)'
Что лучший способ состоит в том, чтобы обойти это?
Я знаю, как использовать делегат старого стиля:
MyClass.DoThis( delegate(Foo foo) {
foo.DoSomething();
});
Это намного более подробное выражение, чем лямбда. Я также обеспокоен тем, что это может не сработать, если вам нужны деревья выражений, хотя я не уверен в этом.
Компилятор никак не может разобраться в этом самостоятельно. Вызов действительно неоднозначен, и вам придется как-то уточнить для компилятора, какая перегрузка вам нужна. Имя параметра "foo" здесь несущественно в разрешении перегрузки.
MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething()));