将lambda转换为自定义委托

时间:2013-09-03 12:33:03

标签: c# delegates implicit-conversion implicit-typing

在程序集MyLibrary.Common中,我定义了一个通用委托类型:

namespace MyLibrary.Common {
  public delegate TResult Instruction<in TArgument, out TResult>(
      CancellationToken cancellationToken,
      Action reportProgress,
      TArgument argument);
}

然后我通过链接到相应的DLL来引用另一个VS2010项目中的这个程序集。

当我想使用以下方法创建此类型的实例时,我收到以下错误:

Instruction<string, bool> instruction =
  (cancellationToken, reportProgress, argument) => SomeOperation(argument);

private static bool SomeOperation(string arg) {
  return false;
}

错误我登上instruction = ...

  

无法转换源类型&#39; lambda表达式&#39;定位类型&#39; MyLibrary.Common.Instruction&#39;


当我尝试将SomeOperation(argument)的应用程序编写为private static bool SomeOperationWrapped(string argument)并将SomeOperationWrapped标识符分配给我的instruction变量时,我得到的错误是

  

预期的方法是&#39; ??? SomeOperationWrapped()&#39;签名


奇怪的是,在另一个VS2010项目中,我没有遇到任何问题,将lambda表达式分配给我的Instruction<TArgument, TResult变量。

2 个答案:

答案 0 :(得分:1)

有趣的是,你说在不同的VS2010项目中没有这样的问题。很高兴看到那些代码(有效)是什么样的。

源项目和使用项目是否都设置为相同的.Net Framework版本,也可能使用相同的工具版本?

也许编译器在推断类型时遇到问题 - 尝试显式键入lambda参数,和/或显式地将lambda转换为委托类型:

Instruction<string, bool> instruction = (CancellationToken cancellationToken, Action reportProgress, string argument) => SomeOperation(argument);

Instruction<string, bool> instruction = (Instruction<string, bool>)((CancellationToken cancellationToken, Action reportProgress, string argument) => SomeOperation(argument));

答案 1 :(得分:0)

受到chamila_c's answer的启发,结果是单独打开麻烦的项目(而不是通过打开它的父解决方案)解决了这些问题。
重现修复的步骤:

  • 单独打开项目。 VS2010为它创建了一个新的(临时)解决方案。
  • 打开项目的原始解决方案以继续处理您的代码

到目前为止,我并不确切知道为什么会这样,但我认为这是一种非正式的“清洁工程”操作。