rustc 可以给我更多关于类型歧义错误的细节吗?



有这个熟悉的编译错误:

error[E0283]: type annotations required: cannot resolve `T: Constraint`
...

然后rustc --explain E0283说:This error occurs when the compiler doesn't have enough information to unambiguously choose an implementation,并举了一个有用的例子。

我确切地知道如何修复错误 - 例如,请参阅此答案。

不过,我想知道是否可以鼓励rustc告诉我更多。具体来说,类型检查器在保释之前最终得到的可能具体类型的空间的一些表示。

当类型检查器无法推断出明确的类型时,并不一定意味着它不能从一些有限的已知竞争者中进行选择。这是您从文档中引用的示例:

trait Generator {
fn create() -> u32;
}
struct Impl;
impl Generator for Impl {
fn create() -> u32 { 1 }
}
struct AnotherImpl;
impl Generator for AnotherImpl {
fn create() -> u32 { 2 }
}
fn main() {
let cont: u32 = Generator::create();
// error, impossible to choose one of Generator trait implementation
// Should it be Impl or AnotherImpl, maybe something else?
}

如果AnotherImpl不存在,并且ImplGenerator的唯一实现,这仍然行不通。如果是这样,你可以稍后添加AnotherImpl- 甚至在另一个模块或crate中 - 并破坏此代码。通常,添加新定义应该是非中断性的,当然也不应该破坏另一个模块中的代码。如果编译器自动在此处选择Generator的"唯一"实现,则会违反该实现。

回到您最初的问题,错误消息可以为您提供的唯一信息几乎是它已经为您提供的信息。类型检查器没有四处寻找可能的实现,而是简单地拒绝尝试从给定的信息中选择类型。

我找不到任何rustc选项来提供有关E0283的更多信息;但是此错误的代码包括一个注释,可能会给您更多的见解。否则,您的问题的答案似乎是否定的。抱歉,我无法获得更多帮助。

相关内容