为什么这个代码适用于不同的类型
本文关键字:类型 适用于 代码 为什么 | 更新日期: 2023-09-27 17:59:11
我正在研究一些教室示例。这个代码有效,但我不明白为什么它有效。我知道有一个泛型类型,该类实现了Item,但Item只是另一个类。为什么这段代码允许在同一列表中使用int和double。
我确信这与Generic有关,但为什么我不太确定。
问题:为什么这个代码允许两个不同的类型进入同一列表
类别定义:
public class Item<T> : Item
{
}
public class Item
{
}
代码:
static void Main(string[] args)
{
var list = new List<Item>();
list.Add(new Item<int>());
list.Add(new Item<double>());
}
您在这里的困惑源于您有两个泛型类型,而不是一个。第一个是通用列表,您已经了解了。第二类是通用的Item
类:
public class Item<T> : Item
这个类的定义声明Item<T>
总是继承Item
,而不管T
是什么类型。这意味着,当您创建List<Item>
。。。
var list = new List<Item>();
您可以将任何Item<T>
添加到其中,因为任何Item<T>
都是Item
。
为什么这段代码允许在同一列表中使用int和double。
它之所以有效,是因为您存储的是Item
,而不是Item<T>
。
这个等价的代码使它更容易看到:
//list.Add(new Item<int>());
Item item1 = new Item<int>(); // implicit conversion from Item<int> to Item
list.Add(item1);
//list.Add(new Item<double>());
Item item2 = new Item<double>();
list.Add(item2);
它之所以有效,是因为Item<T>
是Item
,所以Item<double>
可以放在List<Item>
中,Item<int>
也可以
混淆的部分原因可能是您对不同的类使用了相似的类型名称(Item
和Item<T>
)。尽管在您的案例中,一个继承自另一个,但类和该类的泛型版本之间没有内置连接。
示例中令人困惑的是基类和派生类都有标签"Item"。然而,只需更改一些名称,您的代码就相当于:
public class Pet {}
public class Dog : Pet {}
public class Cat : Pet {}
static void Main(string[] args)
{
var list = new List<Pet>(); // base type items
list.Add(new Dog());
list.Add(new Cat());
}
即使列表中存储了两种不同的类型,它们也是从同一个基类派生的。理解代码的关键是List<>
是基本类型的容器,在本例中为"Pet",在您的示例中,基本类型为"Item"。