我有一个带有重载方法的类:
MyClass.DoThis(Action<Foo> action);
MyClass.DoThis(Action<Bar> 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>
)'
解决这个问题的最佳方法是什么?
答案 0 :(得分:23)
MyClass.DoThis((Foo foo) => foo.DoSomething());
答案 1 :(得分:2)
编译器无法自行解决这个问题。调用确实是模糊的,你必须以某种方式澄清你想要的编译器的重载。在重载分辨率中,参数名称“foo”无关紧要。
MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething()));
答案 2 :(得分:0)
我知道的方法是使用旧式代理:
MyClass.DoThis( delegate(Foo foo) {
foo.DoSomething();
});
这比lambda更冗长。我也担心如果你想要一个表达树,它可能不起作用,虽然我不确定。