代码之家  ›  专栏  ›  技术社区  ›  Craig Walker

C.NET中的lambda调用不明确

  •  6
  • Craig Walker  · 技术社区  · 16 年前

    我有一个重载方法的类:

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

    我要将lambda表达式传递给操作版本:

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

    不幸的是,Visual Studio不能正确区分 Action<Foo> Action<Bar> 版本,由于围绕“foo”变量的类型推断,因此会引发编译器错误:

    以下方法或属性之间的调用不明确:“MyClass.DoThis(System.Action) <Foo> )'和'myclass.dothis(system.action) <Bar>

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

    3 回复  |  直到 16 年前
        1
  •  23
  •   Marc Gravell    16 年前
    MyClass.DoThis((Foo foo) => foo.DoSomething());
    
        2
  •  2
  •   Mehrdad Afshari    16 年前

    编译器无法自己解决这个问题。调用确实是不明确的,您必须以某种方式澄清编译器所需的重载。参数名“foo”在重载分辨率中不重要。

    MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething()));
    
        3
  •  0
  •   Craig Walker    16 年前

    我知道的方法是使用旧样式的委托:

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

    这比lambda要详细得多。我还担心,如果你想要表达树的话,这可能不起作用,尽管我对此不确定。

    推荐文章