将lambda转换为自定义委托
本文关键字:自定义 lambda 转换 | 更新日期: 2023-09-27 18:29:58
在程序集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为它创建了一个新的(临时)解决方案
- 打开项目的原始解决方案以继续处理代码
到目前为止,我不知道这到底是为什么,但我认为这是某种书外的"清洁项目"操作。