C#,“通用项”列表,其中包含“特定项”
本文关键字:包含 特定项 列表 通用项 | 更新日期: 2023-09-27 17:56:44
假设我有三个类看起来像这样:
abstract class Fruit
{
public string name { get; set; }
}
class Apple : Fruit
{
public int redness { get; set; }
}
class Pear : Fruit
{
public int size { get; set; }
}
在其他地方我有:
List<Fruit> delicious_things = new List<Fruit>{
new Pear(){}
new Apple(){}
}
例如,我如何访问 delicious_things 中的 pear.size?
如果我已经知道 Pear 是 delicious_things[0],我可以做:delicious_things[0].size,但这似乎不起作用。
我错过了什么?提前感谢!
为了访问特定属性,您需要执行强制转换。此外,在执行强制转换时,还应考虑使用 as
或is
运算符。因为如果您尝试执行从一种不兼容类型到另一种不兼容类型的转换(例如从 Apple
到 Pear
),您将获得InvalidCastException
:
var pear = delicious_things[0] as Pear;
int size;
if(pear != null) size = pear.size;
或:
if(delicious_things[0] is Pear)
{
int size = ((Pear)delicious_things[0]).size;
}
您必须将项目强制转换为特定类型。
((Pear)delicious_things[0]).size
但是,这不是好的设计。请参阅为什么要避免铸造?
您可以
执行以下操作来筛选特定类型:
delicious_things.OfType<Pear>().First().size;
像这样,您确定它将在不投射对象的情况下进行第一Pear
。
当然,您仍然不确定列表是否至少包含一个类型 Pear
的元素
总是想所有的可能性——>否则一旦将来你会摔倒它