InvalidCastException при приведении из базового класса в унаследованный класс? - PullRequest
1 голос
/ 12 сентября 2011
public abstract class ContentManagedEntity
{
    public Guid Guid { get; set; }

    public bool Active;

    public int DisplayOrder;
}

public class StoreCategory : ContentManagedEntity
{
    public string Name { get; set; }
}

public class XMLStoreCategory : StoreCategory, IXMLDataEntity
{
    public bool Dirty = false;
}

void main() {
    var storecategory = new StoreCategory { Name = "Discount Stores" };
    var xmlstorecategory = (XMLStoreCategory) storecategory; // Throws InvalidCastException
}

Есть ли причина, по которой он генерирует исключение InvalidCastException во время выполнения в последней строке?

(Бах, как я уже писал, ответ выскочил у меня в голове, ясный, как день.потомство, и просто чтобы убедиться, что я правильно понял.)

Ответы [ 3 ]

4 голосов
/ 12 сентября 2011

Вы спрашиваете это:

class Animal { }
class Cat : Animal { }
class ShortHairedCat : Cat { }

ShortHairedCat shortHairedCat = (ShortHairedCat)new Cat();

Является ли Cat a ShortHairedCat?Не обязательно.В данном конкретном случае new Cat() - это Cat, а не ShortHairedCut, поэтому, конечно, вы получаете исключение времени выполнения.

Помните, что модели наследования - это отношения .Это не обязательно тот случай, когда Base является Derived, поэтому, в общем, «уныние» опасно.

3 голосов
/ 12 сентября 2011

Все XMLStoreCategory объекты StoreCategory с, но не все StoreCategory с XMLStoreCategory с.В этом случае вы создаете StoreCategory и пытаетесь превратить его во что-то, чего нет.

2 голосов
/ 12 сентября 2011

Вы создали экземпляр объекта как StoreCategory.Это не то же самое, что XMLStoreCategory, поэтому вы не можете разыграть его таким образом.

Случай, когда приведение будет работать, выглядит примерно так:

StoreCategory storecategory = new XMLStoreCategory { Name = "Discount Stores" };
var xmlstorecategory = (XMLStoreCategory) storecategory;

Это сработает,но в вашем конкретном случае это несколько бесполезно.Просто создайте экземпляр XMLStoreCategory и вам будет хорошо.

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