对 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) а;
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) а;
类 是 "reference types"。它们存在于 "the heap" 上,在黑暗中的某个地方,你只能操纵对它们的引用。整数和双打是不同的。他们是 "value types":
int n = 4;
double d = (double)n;
该代码实际上创建了一个新的双精度值,等于 4.0。 d
没有 "refer to" n;它是它自己的,不同的价值。这与引用类型的工作方式非常不同。
这是 .NET 类型系统的基本功能。 struct
(例如 DateTime
)也是一种值类型。
我有两个类:
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) а;
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) а;
类 是 "reference types"。它们存在于 "the heap" 上,在黑暗中的某个地方,你只能操纵对它们的引用。整数和双打是不同的。他们是 "value types":
int n = 4;
double d = (double)n;
该代码实际上创建了一个新的双精度值,等于 4.0。 d
没有 "refer to" n;它是它自己的,不同的价值。这与引用类型的工作方式非常不同。
这是 .NET 类型系统的基本功能。 struct
(例如 DateTime
)也是一种值类型。