¿Por qué no se puede usar el rasgo implícito para devolver tipos múltiples / condicionales?

Estoy tratando de obtener un generador de números aleatorios. Ya queOsRng::new() puede fallar, me gustaría volver athread_rng() si yo tengo que

extern crate rand; // 0.5.5

use rand::{thread_rng, OsRng, RngCore};

fn rng() -> impl RngCore
{
    match OsRng::new() {
        Ok(rng) => rng,
        Err(e) => thread_rng()
    }
}

Sin embargo, recibo este mensaje de error que no puedo entender:

error[E0308]: match arms have incompatible types
 --> src/lib.rs:6:5
  |
6 | /     match OsRng::new() {
7 | |         Ok(rng) => rng,
8 | |         Err(e) => thread_rng(),
  | |                   ------------ match arm with an incompatible type
9 | |     }
  | |_____^ expected struct `rand::OsRng`, found struct `rand::ThreadRng`
  |
  = note: expected type `rand::OsRng`
             found type `rand::ThreadRng`

Por qué el compilador esperarand::OsRng aquí en lugar de una implementación deRngCore? Si elimino lamatch y directamente regresarthread_rng(), No recibo el mensaje de error anterior.

No creo que este sea un duplicado de ¿Cómo devuelvo una instancia de un rasgo de un método?, ya que la otra pregunta es acerca decóm one puede devolver un rasgo de una función, y esta pregunta es sobrepor qu el compilador no me permitirá devolver un rasgo, pero quiere que devuelva unOsRng que no es el tipo de retorno de la función.

Respuestas a la pregunta(1)

Su respuesta a la pregunta