Let's say I have crates: A, B and main.
A depends on crate mega_traits 0.1.1
B depends on crate mega_traits 0.2.1
main depends on A and B and mega_traits 0.2.1.
In A there is type:
struct A;
impl mega_traits::Trait for A {}
and in main
fn f<X: mega_traits::Trait>(x: X) {}
f(A::A);
and this code compiles and works without problelm. Why?
Cargo.lock for main contains both version of mega_traits.
So A::A
implements mega_traits@0.1.1::Trait
,
while main::f
requires mega_traits@0.2.1::Trait
.
So I expect compile time error here,
but it works. But how? Is compiler smart enough to check mega_traits@0.1.1::Trait
and mega_traits@0.2.1::Trait
find out that this exactly the same trait
and allow usage of
mega_traits@0.1.1::Trait
instead of mega_traits@0.2.1::Trait
?