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);

考え:2番目のスニペットに見られるようRに、「ラムダ」のリターンタイプによってすでに決定されています。なぜ同じことが最初に当てはまらないのですか?ec(これは別のコンパイラのヒントになるはずです)を使用しても、推測に失敗します。

4

1 に答える 1

4

問題は、コンパイラRが関数の推測に失敗した場合CallWithEscapeContinuationではなく、ラムダの型の推測に失敗したことだと思います。

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と、ラムダがそのタイプとのシグネチャから推測できCallWithEscapeContinuationます。

ラムダの可能なシグニチャに影響を与える型パラメータがないため、(とActionは対照的にAction<R>)上記は関係ありません。

于 2012-06-04T16:07:55.123 に答える