Мне было интересно, почему некоторые кавычки на С# проверяются во время компиляции, тогда как в других случаях ответственность сбрасывается на CLR. Как и выше, оба неверны, но обрабатываются по-другому.
class Base { }
class Derived : Base { }
class Other { }
static void Main(string[] args)
{
Derived d = (Derived)new Base(); //Runtime InvalidCastException
Derived d = (Derived)new Other(); //Compile-time Cannot convert type...
}
При чтении "С# in depth" я нашел информацию по этой теме, где автор говорит:
"Если компилятор видит, что на самом деле это невозможно сделать для этого приведения, itll запускает ошибку компиляции, и если ее теоретически разрешено, но фактически неверно во время выполнения, CLR генерирует исключение".
"Теоретически" означает связь иерархии наследования (какое-то другое сходство между объектами?) или это внутренний бизнес компилятора?