Потому что Err
не тип.
Err
- это вариант Result<T, E>
, тип которого Result<T, E>
. Поскольку Result<T, E>
отличается от Result<U, E>
, кроме случаев T == U
, и поскольку неявное преобразование не требуется, вам необходимо явно выполнить преобразование.
Я признаю, что это выглядит глупо, так как вывод типа заботится о выводе T
, U
и E
в этом случае, что приводит к Err(e) => return Err(e)
, но на семантическом уровне эти 2 Err(e)
имеют разные типы.
Для другого глупого примера:
enum Term<'a> {
Int(i64),
String(&'a str),
}
fn staticify(t: Term) -> Term<'static> {
use Term::*;
match t {
String(_) => String("Hello, World!"),
_ => t,
}
}
Сбой по той же причине, потому что Term<'a>
и Term<'static>
не относятся к одному и тому же типу, если 'a == 'static
. Когда Term
содержит в основном не-временные параметры, это становится утомительным: (