【问题标题】:Ambiguous Call with a Lambda in C# .NET在 C# .NET 中使用 Lambda 进行模糊调用
【发布时间】:2011-01-16 06:22:46
【问题描述】:

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

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

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

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

不幸的是,由于围绕“foo”变量的类型推断,Visual Studio 正确地无法区分 Action&lt;Foo&gt;Action&lt;Bar&gt; 版本 - 因此它会引发编译器错误:

以下方法或属性之间的调用不明确:'MyClass.DoThis(System.Action&lt;Foo&gt;)' 和 'MyClass.DoThis(System.Action&lt;Bar&gt;)'

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

【问题讨论】:

    标签: c# .net lambda


    【解决方案1】:

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

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

    这比 lambda 详细得多。我也担心如果你想要一个表达式树它可能不起作用,虽然我不确定。

    【讨论】:

      【解决方案2】:
      MyClass.DoThis((Foo foo) => foo.DoSomething());
      

      【讨论】:

        【解决方案3】:

        编译器无法自己解决这个问题。这个调用确实是模棱两可的,你必须以某种方式澄清你想要编译器的重载。参数名称“foo”在重载决议中是无关紧要的。

        MyClass.DoThis(new Action<Foo>(foo => foo.DoSomething()));
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多