9

为什么以下无法推断R

static R Foo<R>(Func<Action<R>, R> call) { ... }

虽然几乎“相同”,但有效:

static R Foo<R>(Func<Action, R> call) { ... }

用法:

var i = Foo(ec => -1);

“必须”调用第一个示例进行编译的方式:

var i = Foo<int>(ec => -1);

- 或者 -

var i = Foo((Action<int> ec) => -1);

想法:从第二个片段中可以看出,R已经由“lambda”的返回类型确定。为什么不能同样适用于第一个?即使使用ec(这应该是另一个编译器提示),它也无法推断。

4

1 回答 1

4

我认为问题不在于编译器如果无法推断出R函数CallWithEscapeContinuation,而是无法推断出 lambda 的类型:

ec =>
{
  Enumerable.Range(0, 100).Select(x =>
  {
              // Called here, the compiler has no idea what signature to expect for `ec`
              // Could be Action<Int>, could be Action<Decimal> (for example).
    if (x == 40) ec(x);
    return x;
  }).ToList();
  return -1;
}

而当您提供int​​提示时,它可以从中推断出 lambda 的类型以及CallWithEscapeContinuation.

当您只有Action(而不是Action<R>)时,上述内容无关紧要,因为没有影响 lambda 可能签名的类型参数。

于 2012-06-04T16:07:55.123 回答