Hay un par de razones por las que se permite esta conversión.
Primero, como se ha dicho en otras respuestas, el operador del reparto quiere decir "Sé más que usted; le garantizo que esta conversión tendrá éxito y si me equivoco, ejecute una excepción y bloquee el proceso". Si le mientes al compilador, las cosas malas van a suceder; de hecho es no haciendo esa garantía, y el programa es bloqueándose como resultado.
Ahora, si el compilador puede decir que lo está mintiendo, entonces puede atraparlo en la mentira. ¡No es necesario que el compilador sea arbitrariamente listo para atraparte con tus mentiras! El análisis de flujo necesario para determinar que una expresión de tipo Base es nunca va a ser del tipo Derivado es complejo; considerablemente más complejo que la lógica que ya implementamos para detectar cosas como variables locales sin asignar. Tenemos mejores formas de gastar nuestro tiempo y esfuerzo que mejorar la capacidad del compilador para atraparlo en obvias mentiras.
El compilador tanto típicamente razones que sólo alrededor tipos de expresiones, no sobre los valores posibles . Únicamente desde el análisis de tipo es imposible saber si la conversión tendrá éxito o no. Es podría tener éxito, y entonces está permitido. Los únicos bloqueos que no se permiten son los que el compilador sabe siempre fallan del análisis de tipo.
segundo lugar, es posible decir (Derived)(new Base())
donde derivada es un tipo que implementa el tipo bajo y tienen que no fallan en tiempo de ejecución. ¡También es posible que (Base)(new Base())
falle con una excepción de conversión no válida en el tiempo de ejecución! ¡Hechos reales! Estas son situaciones extraordinariamente raras, pero son posibles.
Para más detalles, ver mis artículos sobre el 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
¿Por qué se puede esperar que el compilador siga todas las posibles rutas de código para determinar que 'p 'no ha sido cambiado antes del reparto? –
Y si el evento no ha cambiado, Post puede implementar un operador implícito para lanzarse a Question o viceversa. – PVitt
los moldes son para vaqueros, subirse al toro y montar a bebés – kenny