C # явное приведение производных типов - PullRequest
1 голос
/ 29 января 2010

Если я создаю класс A, а класс B наследуется от класса A, почему C # требует от меня явного приведения между ними?

Например:

public class Mammal
{
}

public class Dog : Mammal
{
}

...

Mammal foo = new Dog(); // Invalid, wants an explicit cast
Mammal bar = (Mammal)new Dog(); // This one works

Мне просто любопытно, какова причина этого ограничения.

Ответы [ 2 ]

6 голосов
/ 29 января 2010

Не совсем уверен, что вы имеете в виду? Оба написанных вами утверждения компилируются и работают нормально.

Вы хотели написать это как вопрос ...?

Dog foo = new Mammal(); // Invalid, wants an explicit cast
Dog bar = (Dog)new Mammal(); // This one works

Если это было то, что вы имели в виду (что соответствовало бы комментариям), то первый не скомпилируется, потому что Mammal не является Dog и компилятор знает это, поэтому он не позволит вам назначить его ( Dog - это Mammal, потому что оно получено из него, но обратное утверждение не выполняется). Во втором случае вы переопределяете правильное суждение компилятора и говорите, что лучше знаете, что Mammal действительно является Dog, но, как это не так, это утверждение не выполнится во время выполнения с InvalidCastException.

2 голосов
/ 29 января 2010

Они оба работают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...