类型推断神秘地失败
本文关键字:失败 类型 | 更新日期: 2023-09-27 18:36:10
为什么以下无法推断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
(这应该是另一个编译器提示),它也无法推断。
我认为问题不在于编译器未能推断出函数CallWithEscapeContinuation
的R
,而是它无法推断出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 的可能签名。