我正在研究一些代码并做出以下观察:
let x = 1;
let () = x;
error: mismatched types [E0308]
note: expected type `_`
note: found type `()`
这显然失败了,但我期望错误指出预期类型是 i32
,而不是 _
。我发现对于未指定类型的 float 文字也会发生同样的情况,例如1.0
。
为什么会这样?该类型不应该被称为默认类型吗?
更新:从 Rust 1.12 开始,错误消息提供了更多信息:
expected integral variable, found ()
= note: expected type `{integer}`
= note: found type `()`
最佳答案
Rust 不仅从初始化中进行类型推断,而且从每次使用中进行类型推断。因此,它的类型检查器必须查看变量的每次使用以确定它是什么类型,并且需要随着它的进行推断和检查类型。
这意味着 let () = x;
是同一过程的一部分。它是 x
的用法,因此必须检查以查看 x
可能是什么具体类型。在编译器仍在尝试推断 x
的类型的同时,发现没有可能的类型可以匹配 ()
,因此没有选择默认值,因为默认值仅在编译器查看了 x
的所有用法但未找到任何内容时使用。
关于types - 什么时候将数字文字分配给默认类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39595782/