struct Foo { inner: u32, } struct Bar { inner: u32, } #[derive(Clone, Copy)] struct Baz { inner: u32, } impl From for Bar { fn from(other: Baz) -> Self { Self { inner: other.inner, } } } impl From for Foo { fn from(other: Baz) -> Self { Self { inner: other.inner, } } } fn main() { let x: Baz = Baz { inner: 42 }; // DOESN'T Compile: Multiple options! let y = x.into(); //~ ERROR E0283 let y_1: Foo = x.into(); let y_2: Bar = x.into(); let z_1 = Foo::from(y_1); let z_2 = Bar::from(y_2); // No type annotations needed, the compiler KNOWS the type must be `Foo`! let m = magic_foo(x); } fn magic_foo(arg: Baz) -> Foo { arg.into() }