Неоднозначный вызов с лямбдой в.NET C#

У меня есть класс с перегруженным методом:

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>)'

Что лучший способ состоит в том, чтобы обойти это?

6
задан Eric Lippert 12 February 2010 в 18:15
поделиться

3 ответа

MyClass.DoThis((Foo foo) => foo.DoSomething());
23
ответ дан 8 December 2019 в 04:29
поделиться

Я знаю, как использовать делегат старого стиля:

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

Это намного более подробное выражение, чем лямбда. Я также обеспокоен тем, что это может не сработать, если вам нужны деревья выражений, хотя я не уверен в этом.

0
ответ дан 8 December 2019 в 04:29
поделиться

Компилятор никак не может разобраться в этом самостоятельно. Вызов действительно неоднозначен, и вам придется как-то уточнить для компилятора, какая перегрузка вам нужна. Имя параметра "foo" здесь несущественно в разрешении перегрузки.

MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething()));
2
ответ дан 8 December 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: