为什么这个代码适用于不同的类型

本文关键字:类型 适用于 代码 为什么 | 更新日期: 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> 也可以

混淆的部分原因可能是您对不同的类使用了相似的类型名称(ItemItem<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"。