Это называется уныние. Это довольно хорошее краткое введение , когда все в порядке, а когда нет (в любом случае, в C #) ...
Animal a;
a = b;
Bird b = (Bird) a; // Okay
Этот код успешно скомпилируется.
Во время выполнения оператор приведения
выполняет проверку, чтобы определить,
упомянутый объект действительно
типа птица. Если это не так, время выполнения
InvalidCastException повышен.
Но вам не нужно этого делать. Ваш производный тип должен иметь возможность делать все, что может делать ваш базовый тип. Если у вас есть базовый тип и вы хотите что-то, что может делать только производный тип, то вам лучше сделать экземпляр производного типа, чтобы сделать это! :)
Редактировать за комментарий: Нет причины, по которой вы не можете предоставить конструктор Derived, который берет экземпляр Base и строит вокруг него Derived (например, Derived вокруг конкретной базы) ...
public D(B b)
{
}
Но мне кажется, что вам нужен интерфейс или вам следует ослабить требования к параметру вашего метода. В конце концов, если ваш метод может нормально работать с Animal, нет никаких причин, по которым он должен заставлять вас передавать ему Bird, что, по-видимому, и делает ваш метод.