C# .NET中使用Lambda表达式时出现歧义调用问题

6

我有一个带有重载方法的类:

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

我希望将lambda表达式传递给Action版本:

我希望传递一个lambda表达式到Action版本:

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

很遗憾,由于涉及“foo”变量周围的类型推断,Visual Studio无法正确区分Action<Foo>Action<Bar>版本,因此会引发编译错误:

调用以下方法或属性时存在歧义:'MyClass.DoThis(System.Action<Foo>)' 和 'MyClass.DoThis(System.Action<Bar>)'

如何解决这个问题呢?
3个回答

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();
});

这比lambda要冗长得多。我还担心如果你想要表达式树,它可能无法工作,尽管我对此不确定。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接