Когда средство проверки типов не может вывести однозначный тип, это не обязательно означает, что он не может выбирать из некоторого конечного набора известных претендентов. Вот пример , на который вы ссылаетесь из документации:
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
не было и Impl
была только реализациейиз Generator
, это все равно не сработает.Если это так, вы можете позже добавить AnotherImpl
- даже в другой модуль или ящик - и сломать этот код.В общем, добавление нового определения должно быть неразрывным и, конечно, не должно быть в состоянии нарушить код в другом модуле.Если компилятор автоматически выберет «единственную» реализацию Generator
здесь, это нарушит это.
Возвращаясь к исходному вопросу, единственная информация, которую может дать вам сообщение об ошибке, это почти то, что уже есть.давая вам.Проверка типов не искала возможные реализации, а просто отказалась даже пытаться выбрать тип из представленной информации.