Being able to cast an object to an incompatible type would lead to a breach in the type safety of the system, which clearly is to be avoided.
InvalidCastException is the CLR’s way to block every such attempt.
Nowadays, after the introduction of generic types, the use of casts should have become much rarer than it used to be. Every time you have to cast an object to a more specific type, ask yourself how you ended up in this situation in the first place. Maybe it has something to do with generics. And if you find yourself performing a type-based switch using
as, perhaps using object-oriented virtual dispatch facilities is more appropriate.
Either way, if you do a cast, you had better darn well know what the target type ...