Nel paradigma della programmazione ad oggetti, qualora un campo, una variabile o parametro faccia riferimento ad una classe, è possibile accettare riferimenti a qualsiasi istanza di tale classe o una delle sue discendenti in quanto è garantito dallo stesso paradigma che le classi discendenti, ereditando tutto ciò che è presente nella classe base, non saranno private di nulla che si trova in quest'ultima.

Ovviamente, riflettendo questo principio, non può essere vero il contrario; per questo motivo l'operazione che tenti di eseguire segnala un errore, a meno che tu non esegua un "cast" esplicitando così le tue intenzioni; a runtime, se non è possibile eseguire il cast indicato, verrà generata opportunamente un'eccezione.

Ciao!