gpt4 book ai didi

c# - 理解语言规范中描述的 C# 类型推断的问题

转载 作者:IT王子 更新时间:2023-10-29 03:44:33 24 4
gpt4 key购买 nike

C# language specification 在第 §7.5.2 节中描述了类型推断。里面有个细节我没看懂。考虑以下情况:

// declaration
void Method<T>(T obj, Func<string, T> func);

// call
Method("obj", s => (object) s);

Microsoft 和 Mono C# 编译器都正确地推断出 T = object,但我对规范中算法的理解会产生 T = string 然后失败。这是我的理解:

第一阶段

  • 如果 Ei 是匿名函数,则从 Ei 到 Ti 进行显式参数类型推断(§7.5.2.7)

    ⇒ 没有效果,因为 lambda 表达式没有明确的参数类型。对吧?

  • 否则,如果 Ei 的类型为 U 并且 xi 是一个值参数,则从 U 到 Ti 进行下限推断

    ⇒ 第一个参数是静态类型 string,所以这会将 string 添加到 T 的下限,对吗?

第二阶段

  • 所有 不固定 类型变量 Xi 不依赖于 (§7.5.2.5) 任何 Xj 都是固定的 (§7.5.2.10)。

    T 不固定; T 不依赖于任何东西...所以 T 应该是固定的,对吧?

§7.5.2.11 修复

  • 候选类型集 Uj 开始时是 Xi 边界集中所有类型的集合。

    ⇒ { string(下限)}

  • 然后我们依次检查 Xi 的每个界限:[...] 对于 Xi 的每个下界 U,所有类型 Uj 都从候选集中删除,这些 Uj 没有从 U 隐式转换到的类型。 [...]

    ⇒ 不会从候选集中删除任何内容,对吧?

  • 如果在剩余的候选类型 Uj 中有一个唯一的类型 V,从该类型 V 可以隐式转换到所有其他候选类型,则 Xi 固定为 V。

    ⇒ 因为只有一种候选类型,所以这是空洞的,所以 Xi 固定为 string。对吧?


那么我哪里出错了?

最佳答案

更新:我今天早上在公交车上的初步调查是不完整和错误的。第一阶段规范的文本是正确的。实现是正确的。

规范是错误的,因为它在第二阶段弄错了事件的顺序。我们应该指定在修复非依赖参数之前进行输出类型推断。

伙计,这东西很复杂。我已经多次重写规范的这一部分。

我以前见过这个问题,我清楚地记得曾进行过修改,将不正确的术语“类型变量”替换为“类型参数”。 (类型参数不是其内容可以变化的存储位置,因此将它们称为变量是没有意义的。)我认为同时我注意到顺序是错误的。可能发生的事情是我们不小心在网上发布了旧版本的规范。非常抱歉。

我将与 Mads 合作更新规范以匹配实现。我认为第二阶段的正确措辞应该是这样的:

  • If no unfixed type parameters exist then type inference succeeds.
  • Otherwise, if there exists one or more arguments Ei with corresponding parameter type Ti such that the output type of Ei with type Ti contains at least one unfixed type parameter Xj, and none of the input types of Ei with type Ti contains any unfixed type parameter Xj, then an output type inference is made from all such Ei to Ti.

Whether or not the previous step actually made an inference, we must now fix at least one type parameter, as follows:

  • If there exists one or more type parameters Xi such that Xi is unfixed, and Xi has a non-empty set of bounds, and Xi does not depend on any Xj then each such Xi is fixed. If any fixing operation fails then type inference fails.
  • Otherwise, if there exists one or more type parameters Xi such that Xi is unfixed, and Xi has a non-empty set of bounds, and there is at least one type parameter Xj that depends on Xi then each such Xi is fixed. If any fixing operation fails then type inference fails.
  • Otherwise, we are unable to make progress and there are unfixed parameters. Type inference fails.

If type inference neither fails nor succeeds then the second phase is repeated.

这里的想法是我们要确保算法永远不会进入无限循环。在第二阶段的每次重复中,它要么成功,要么失败,要么取得进展。它的循环次数不可能超过固定类型的类型参数。

感谢您提醒我注意这一点。

关于c# - 理解语言规范中描述的 C# 类型推断的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3697252/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com