title: Why is type conversion from u64 to usize allowed using `as` but not `From`?
body: <p>The first conversion using 'as' compiles, but the second one using the 'From' trait does not:</p>
  
  <pre><code>fn main() {
      let a: u64 = 5;
      let b = a as usize;
      let b = usize::from(a);
  }
  </code></pre>
  
  <p>Using Rust 1.34.0, I get the following error:</p>
  
  <pre class="lang-none prettyprint-override"><code>error[E0277]: the trait bound `usize: std::convert::From&lt;u64&gt;` is not satisfied
   --&gt; src/main.rs:4:13
    |
  4 |     let b = usize::from(a);
    |             ^^^^^^^^^^^ the trait `std::convert::From&lt;u64&gt;` is not implemented for `usize`
    |
    = help: the following implementations were found:
              &lt;usize as std::convert::From&lt;bool&gt;&gt;
              &lt;usize as std::convert::From&lt;std::num::NonZeroUsize&gt;&gt;
              &lt;usize as std::convert::From&lt;u16&gt;&gt;
              &lt;usize as std::convert::From&lt;u8&gt;&gt;
    = note: required by `std::convert::From::from`
  </code></pre>
  
  <p>When I replace <code>u64</code> with <code>u8</code>, there is no more error. From the error message, I understand that the <code>From</code> trait is implemented only for <code>u8</code>, but not for the other integer types.</p>
  
  <p>If there is a good reason for that, then why shouldn't the conversion using 'as' should also fail to compile?</p>