在程序集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
变量。
答案 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的启发,结果是单独打开麻烦的项目(而不是通过打开它的父解决方案)解决了这些问题。
重现修复的步骤:
到目前为止,我并不确切知道为什么会这样,但我认为这是一种非正式的“清洁工程”操作。