Ci sono un paio di ragioni per le quali è consentita questa conversione.
In primo luogo, come hanno detto altre persone in altre risposte, l'operatore del cast significa "So più di te, ti garantisco che questa conversione avrà esito positivo e se sbaglio, lancia un'eccezione e interrompi il processo". Se stai mentendo al compilatore, le cose brutte stanno per accadere; in effetti si tratta di non che fa la garanzia, e il programma è arresto anomalo di conseguenza.
Ora, se il compilatore può dire che stai mentendo su di esso, allora può prenderti nella bugia. Il compilatore non è tenuto ad essere arbitrariamente intelligente nel prenderti nelle tue bugie! L'analisi del flusso necessaria per determinare che un'espressione di tipo Base sia mai che sarà di tipo Derivato è complessa; notevolmente più complesso della logica che già implementiamo per catturare cose come variabili locali non assegnate. Abbiamo modi migliori di impiegare il nostro tempo e la nostra fatica piuttosto che migliorare la capacità del compilatore di catturarti in bugie ovvie.
Il compilatore pertanto ragiona tipicamente solo circa tipi di espressioni, non di valori possibili. Solamente dall'analisi del tipo è impossibile sapere se la conversione avrà successo. E 'potrebbe riuscire, e quindi è permesso. Gli unici cast non consentiti sono quelli che il compilatore sa sarà sempre fallire dall'analisi del tipo.
secondo luogo, è possibile dire (Derived)(new Base())
dove derivato è un tipo che implementa tipo di base e lo hanno non non riescono a runtime. È anche possibile che (Base)(new Base())
fallisca con un'eccezione di cast non valida in fase di runtime! Fatti veri! Queste sono situazioni straordinariamente rare ma sono possibili .
Per maggiori dettagli, vedere i miei articoli sul tema:
http://blogs.msdn.com/b/ericlippert/archive/2007/04/16/chained-user-defined-explicit-conversions-in-c.aspx
http://blogs.msdn.com/b/ericlippert/archive/2007/04/18/chained-user-defined-explicit-conversions-in-c-part-two.aspx
http://blogs.msdn.com/b/ericlippert/archive/2007/04/20/chained-user-defined-explicit-conversions-in-c-part-three.aspx
fonte
2011-11-17 16:46:14
perché si aspetta il compilatore di seguire tutti i percorsi di codice possibile determinare che 'p 'non è stato cambiato prima del cast? –
E se l'evento non è stato modificato, Post può implementare un operatore implicito per eseguire il cast stesso su Domanda o viceversa. I calchi – PVitt
sono per i cowboy, salire sul toro e cavalcare il bambino – kenny