我正在深入阅读 C#,对亲爱的作者解释的 2 阶段类型推理规则感到困惑。
考虑代码:
static void PrintConvertedValue<TInput,TOutput> (TInput input, Converter<TInput,TOutput> converter)
{ Console.WriteLine(converter(input)); }
...
PrintConvertedValue("I'm a string", x => x.Length);
之后,他解释了使用两阶段推理算法进行推理的过程。
1.第一阶段开始。
2 、第一个参数是TInput类型,第一个参数是字符串类型。我们推断必须存在从字符串到 TInput 的隐式转换。
3.第二个参数是Converter类型,第二个参数是一个隐式类型的lambda表达式。没有进行推理——我们没有足够的信息。
4.第二阶段开始。
5.
TInput
不依赖任何不固定的类型参数,所以固定为字符串。6.第二个参数现在有一个固定的输入类型,但一个不固定的输出类型。我们可以认为它是
(string x) => x.Length
并推断返回类型为 int。因此,必须进行从 int 到 的隐式转换TOutput
。7.第二阶段重复。
8.
TOutput
不依赖任何不固定的东西,所以它固定为int。9现在没有不固定的类型参数,所以推断成功
我对第 2 步和第 5 步感到非常困惑。在第 2 步中,编译器如何进行这样的推断?我的意思是世界转换是如何进入现场的?转换发生 BTW 类型而不是 BTW 类型参数和类型,不是吗?
第 5 步完全让我无法理解,任何人都可以向我展示一个类型参数可以依赖于其他类型参数的简化示例,请解释作者试图暗示什么?
我敢于潜入 C# 规范,但似乎聪明的人为非常相似的聪明人做了它,而不是像我这样的猴子:)