Por que a característica impl não pode ser usada para retornar vários tipos / condicionais?

Estou tentando obter um gerador de números aleatórios. Desde aOsRng::new() pode falhar, eu gostaria de voltar athread_rng() se eu tiver 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()
    }
}

No entanto, recebo esta mensagem de erro que não consigo 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 que o compilador está esperandorand::OsRng aqui em vez de uma implementação deRngCore? Se eu remover omatch e retornar diretamentethread_rng(), Eu não entendi a mensagem de erro acima.

Não acredito que seja uma duplicata deComo faço para retornar uma instância de uma característica de um método?, como a outra pergunta é sobrequão pode-se retornar uma característica de uma função, e esta pergunta é sobreporque o compilador não permitirá que eu retorne uma característica, mas quer que eu retorne umaOsRng que não é o tipo de retorno da função.

questionAnswers(1)

yourAnswerToTheQuestion