В c# объекты всегда передаются по ссылке, но при передаче ref и out, грубо говоря, передается ссылка на ссылку. У ref параметра можно, а у out обязательно нужно вернуть новый объект.
Почему не разрешено приведение типов для ref и out:
class Animal...
class Dog : Animal...
class Cat : Animal...
void main()
{
Dog dog = new Dog();
someMethod(ref (Animal)dog);
dog == ?
}
void someMethod(ref Animal pet)
{
if (!(pet is Cat)) {
pet.kill();
pet = new Cat();
}
}
какие должны быть значение и тип у переменной dog после вызова someMethod()?
Поэтому и ответ: при передаче ref и out параметра с приведением типа к базовому компилятор ничего не делает и выдает ошибку.