在C#.NET中使用Lambda进行模糊调用

时间:2010-02-12 17:43:23

标签: c# .net lambda

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

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

解决这个问题的最佳方法是什么?

3 个答案:

答案 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更冗长。我也担心如果你想要一个表达树,它可能不起作用,虽然我不确定。