将lambda转换为自定义委托



在程序集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 = ...线上得到的错误是

无法将源类型"lambda表达式"转换为目标类型"MyLibrary.Common.Instruction"


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

应为带有"??"的方法???SomeOperationWrapped()的签名


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

有趣的是,您说在另一个VS2010项目中没有这样的问题。最好看看那个代码(有效)是什么样子的。

源项目和消耗项目是否都设置为以相同的.Net Framework版本为目标,并且可能也使用相同的Tools版本?

也许编译器在推断类型时遇到了问题——尝试将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));

受chamila_c答案的启发,发现自己打开这个麻烦的项目(而不是打开它的父解决方案)解决了问题
复制修复的步骤:

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

到目前为止,我不知道这到底是为什么,但我认为这是某种书外的"清洁项目"操作。

相关内容

  • 没有找到相关文章

最新更新