1

在程序集中,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)为 aprivate static bool SomeOperationWrapped(string argument)并将该SomeOperationWrapped标识符分配给我的instruction变量时,我得到的错误是

期望一个带有 '??? 的方法 SomeOperationWrapped()' 签名


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

4

2 回答 2

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));
于 2013-09-03T13:06:09.787 回答
0

受到chamila_c 答案的启发,事实证明,自己打开麻烦的项目(而不是打开它的父解决方案)可以解决问题。
重现修复的步骤:

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

迄今为止,我并不确切知道为什么会这样,但我认为这是某种不合时宜的“清洁项目”操作。

于 2013-09-03T13:22:45.917 回答