我正在玩一些代码,并做了以下观察:
let x = 1;
let () = x;
error: mismatched types [E0308]
note: expected type `_`
note: found type `()`
这显然失败了,但我希望错误说明期望的类型是i32
,而不是_
。我发现同样的情况发生在一个未指定类型的浮动文字中,例如: 1.0
。
为什么会这样?该类型是否应该被称为默认类型?
更新:从Rust 1.12开始,错误消息提供了更多信息:
expected integral variable, found ()
= note: expected type `{integer}`
= note: found type `()`
答案 0 :(得分:8)
Rust不仅可以从初始化进行类型推断,还可以从每次使用中进行类型推断。因此,它的类型检查器必须查看变量的每个用法以确定它是什么类型,并且需要在它进行时推导和检查类型。
这意味着let () = x;
是同一过程的一部分。它是x
的用法,因此必须检查以查看具体类型x
可能是什么。在编译器仍在尝试推断()
的类型的同时发现没有可能类型匹配x
的事实,因此没有选择默认值,因为默认仅使用当编译器查看x
的所有用法但未找到任何内容时。