我有两个班级:
public class Asset { }
public class Stock : Asset
{
...
}
当我写:
Stock m = new Stock ();
Asset а = m;
Stock s = (Stock) а;
一切正常!
但是当我以这种方式写作时:
Asset а = new Asset();
Stock s = (Stock) а;
结果是InvalidCastException,为什么?
答案 0 :(得分:1)
股票 是一种资产。资产不是股票。
假设您的Asset基类中有3个方法。这些也存在于股票中。因此,当您将股票投资于资产时,您实际上是对股票进行限制。您的对象(即股票)被告知是资产。它知道该怎么做,因为 是一个资产。
股票可能有3个独立的方法,这些方法不属于基础资产类。当您将资产称为股票时,它不知道该怎么做,因为股票的某些部分不属于资产。
答案 1 :(得分:1)
在您的第一个实例中,a
是Asset
类型的引用,但指的是一个实际运行时类型为Stock
的对象。
Stock m = new Stock ();
Asset а = m;
Stock s = (Stock) а;
m
,a
和s
都是对同一实际对象的不同引用,其类型为Stock
。
此处,实际对象不 a 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;
该代码实际上创建了一个新的double,等于4.0。 d
不“引用”n;它是自己的,不同的价值。这与参考类型的工作方式非常不同。
这个东西是.NET类型系统的基本特征。 struct
(例如DateTime
)也是值类型。