Путать о даункаут в C#

У меня есть два класса:

public class Asset {  }

public class Stock : Asset 
{
    ...
}

Когда я пишу:

Stock m = new Stock ();
Asset а = m;             
Stock s = (Stock) а; 

Все отлично работает!

Но когда я пишу так:

Asset а = new Asset();             
Stock s = (Stock) а;

результат InvalidCastException, почему?

2 ответа

В вашем первом случае, a является ссылкой типа Asset, но это относится к объекту, чей фактический тип времени выполнения Stock,

Stock m = new Stock ();
Asset а = m;             
Stock s = (Stock) а; 

m, a, а также s все разные ссылки на один и тот же фактический объект, тип которого Stock,

Здесь фактический объект не Stock, Это просто Asset:

Asset а = new Assert();             
Stock s = (Stock) а;

Потому что Stock наследуется от Asset это надмножество Asset, Вы можете притвориться Stock является Asset и это нормально, потому что Stock частично является Asset - плюс все, что он добавляет самостоятельно. Естественно, это не сокращает оба пути: Asset не все вещи Stock имеет, так что вы не можете относиться к этому, как будто это было Stock,

Ваше назначение a в первом примере не изменил объект в Asset или создайте новый Asset и назначить его m, Это был все тот же объект.

Тип ссылки - это только часть истории.

Попробуй это:

Stock m = new Stock ();
Asset а = m;             

//  This will print "Stock" -- it's still that same actual Stock object. 
Console.WriteLine(a.GetType());

Stock s = (Stock) а; 

Классы являются "ссылочными типами". Они существуют в "куче", где-то в темноте, и вы только когда-либо манипулируете ссылками на них. Целые и двойные разные. Это "типы значений":

int n = 4;
double d = (double)n;

Этот код фактически создает новый дубль, равный 4,0. d не "ссылается" на n; это его собственная, другая ценность. Это сильно отличается от того, как работают ссылочные типы.

Этот материал является фундаментальной особенностью системы типов.NET. struct (например DateTime) также является типом значения.

Акция является активом. Актив не акция.

Скажем, у вас есть 3 метода в базовом классе активов. Они также присутствуют на складе. Следовательно, когда вы разыгрываете Запас на Актив, вы фактически накладываете ограничение на Запас. Ваш объект, который является Запасом, называется Активом. Это он знает, как сделать, так как это актив.

Акция может иметь 3 собственных метода, которые не являются частью базового класса активов. Когда вы говорите, что актив является акцией, он не будет знать, как это сделать, поскольку есть части акции, которые не являются частью актива.

Другие вопросы по тегам