I was wondering why some casts in C# are checked at compile-time whereas in other cases the responsibility is dumped on CLR. Like above both are incorrect but handled in a d
If your variable is of Base
type, is can be theoretically constructed by Derived
constructor, thus being a variable of Derived
type actually. At compile time, compiler does not bother itself with trying to figure out whether in each particular case such downcast (representing a variable of Base
type as an entity of Derived
type) is possible.
Your sample is simple - you create a new class and cast it right away. But what if you get Base
from somewhere else, e.g., some method call? Compiler just cannot "guess" what your method is going to return and therefore throw on not throw an error.
When you cast Other
, compiler sees that there is no possibility that Other
is actually Derived
and throws an exception.
The compiler considers only the static types. The runtime checks the dynamic (runtime) type. Looking at your examples:
Other x = new Other();
Derived d = (Derived)x;
The static type of x
is Other
. This is unrelated to Derived
so the cast fails at compile time.
Base x = new Base();
Derived d = (Derived)x;
The static type of x
is now Base
. Something of type Base
might have dynamic type Derived
, so this is a downcast. In general the compiler can't know from the static type of x
if it the runtime type is Base
, Derived
, of some other subclass of Base
. So the decision of whether the cast is allowed is left to the runtime.