Error code E0377
CoerceUnsized
or DispatchFromDyn
may only be implemented between structs
of the same type.
Example of erroneous code:
#![allow(unused)] #![feature(coerce_unsized)] fn main() { use std::ops::CoerceUnsized; pub struct Foo<T: ?Sized> { field_with_unsized_type: T, } pub struct Bar<T: ?Sized> { field_with_unsized_type: T, } // error: the trait `CoerceUnsized` may only be implemented for a coercion // between structures with the same definition impl<T, U> CoerceUnsized<Bar<U>> for Foo<T> where T: CoerceUnsized<U> {} }
CoerceUnsized
is used to coerce structs that have a field that can be unsized,
like a custom MyBox<T>
being unsized to MyBox<dyn Trait>
. DispatchFromDyn
is used to dispatch from MyBox<dyn Trait>
to MyBox<Self>
in a dyn-compatible
trait.
The compiler cannot support coercions between structs of different types, so
a valid implementation of CoerceUnsized
or DispatchFromDyn
should be
implemented between the same struct with different generic parameters.
Note that CoerceUnsized
and DispatchFromDyn
is mainly used by smart pointers
like Box
, Rc
and Arc
to be able to mark that they can coerce unsized types
that they are pointing at.