对 c# 中的沮丧感到困惑

Confusing about downcast in c#

我有两个类:

public class Asset {  }

public class Stock : Asset 
{
    ...
}

当我写的时候:

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

一切正常!

但是当我这样写的时候:

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

结果是 InvalidCastException,为什么?

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

假设您的 Asset 库中有 3 个方法 class。这些也存在于库存中。因此,当您将 Stock 转换为 Asset 时,您实际上是在对 Stock 施加限制。您的对象是股票,被告知是资产。它知道该怎么做,因为它 一项资产。

该股票可能有 3 种自己的方法,这些方法不属于基本资产 class。当您告诉资产成为股票时,它不知道该怎么做,因为股票的某些部分不属于资产。

在您的第一个实例中,a 是类型 Asset 的引用,但它 引用 实际运行时类型为 [=16] 的对象=].

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

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

这里,实际对象不是一个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) а; 

类 是 "reference types"。它们存在于 "the heap" 上,在黑暗中的某个地方,你只能操纵对它们的引用。整数和双打是不同的。他们是 "value types":

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

该代码实际上创建了一个新的双精度值,等于 4.0。 d 没有 "refer to" n;它是它自己的,不同的价值。这与引用类型的工作方式非常不同。

这是 .NET 类型系统的基本功能。 struct(例如 DateTime)也是一种值类型。