Существует немало вопросов и ответов о том, как взломать ограничение С#, не позволяющее использовать типы возвращаемых методов (и аргументов) для совместимых типов при переопределении, но why существует это ограничение, либо в компиляторе С#, либо в CLR? Как я вижу, нет ничего, что могло бы сломаться, если бы разрешалось совпадение/противоречие, так почему же это объясняется?
Аналогичный вопрос можно задать для расширения параметров доступа - например, переопределение защищенного внутреннего метода с помощью общедоступного метода (что-то, что поддерживает Java, IIRC)