混淆c#

时间:2017-10-20 17:52:44

标签: c# downcast

我有两个班级:

public class Asset {  }

public class Stock : Asset 
{
    ...
}

当我写:

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

一切正常!

但是当我以这种方式写作时:

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

结果是InvalidCastException,为什么?

2 个答案:

答案 0 :(得分:1)

股票 是一种资产。资产不是股票。

假设您的Asset基类中有3个方法。这些也存在于股票中。因此,当您将股票投资于资产时,您实际上是对股票进行限制。您的对象(即股票)被告知是资产。它知道该怎么做,因为 是一个资产。

股票可能有3个独立的方法,这些方法不属于基础资产类。当您将资产称为股票时,它不知道该怎么做,因为股票的某些部分不属于资产。

答案 1 :(得分:1)

在您的第一个实例中,aAsset类型的引用,但指的是一个实际运行时类型为Stock的对象。

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

mas都是对同一实际对象的不同引用,其类型为Stock

此处,实际对象 a Stock。这只是一个Asset

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

由于Stock继承自Asset,因此它是Asset的超集。您可以假装StockAsset,这很好,因为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)也是值类型。