C# 为什么这段代码适用于不同的类型?

C# 为什么这段代码适用于不同的类型?,c#,generics,C#,Generics,我正在做一些教室的例子。这段代码有效,但我不明白它为什么有效。我知道有一个泛型类型,该类实现Item,但Item只是另一个类。为什么这段代码允许int和double进入同一个列表 我确信这与泛型有关,但为什么我不能确定 问题:为什么此代码允许在同一列表中包含两种不同的类型? 类别定义: public class Item<T> : Item { } public class Item { } 公共类项目:项目 { } 公共类项目 { } 代码: static void Main

我正在做一些教室的例子。这段代码有效,但我不明白它为什么有效。我知道有一个泛型类型,该类实现Item,但Item只是另一个类。为什么这段代码允许int和double进入同一个列表

我确信这与泛型有关,但为什么我不能确定

问题:为什么此代码允许在同一列表中包含两种不同的类型?

类别定义:

public class Item<T> : Item
{
}

public class Item
{
}
公共类项目:项目
{
}
公共类项目
{
}
代码:

static void Main(字符串[]args)
{
var list=新列表();
添加(新项());
添加(新项());
}
为什么这段代码允许int和double进入同一个列表

它之所以有效,是因为您存储的是
,而不是

此等效代码更易于查看:

//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);
//list.Add(newitem());
Item item1=新项();//从项到项的隐式转换
增加(第1项);
//添加(新项());
Item item2=新项();
增加(第2项);

您在这里的困惑源于您有两个泛型类型,而不是一个。第一个是通用列表,您已经理解了。第二个是通用
类:

public class Item<T> : Item

。。。您可以向它添加任何
,因为任何
都是

它工作,因为
,所以
可以放入
列表
,也可以放入


部分混淆可能是因为您对不同的类使用了类似的类型名(
Item
Item
)。虽然在您的例子中,一个继承自另一个,但在类和该类的泛型版本之间没有内置连接

您的示例中令人困惑的是,基类和派生类都有标签“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());
}
公共类宠物{}
公营狗:宠物{}
公共类猫:宠物{}
静态void Main(字符串[]参数)
{
var list=new list();//基本类型项
添加(新狗());
添加(新的Cat());
}

即使列表中存储了两种不同的类型,它们也是从同一基类派生的。理解代码的关键是
List
是基本类型的容器,在本例中为“Pet”-在您的示例中,基本类型为“Item”。

提示:
T
是一个类型参数。想想这两个词的意思,代码太多了。尽量使问题代码简短、切中要害。项、项和项都是逐项继承的。由于您将项目存储在集合中,所以它们都可以存储。我已将您的代码剥离回相关部分。在这里查看您的操作方式要容易得多。有时,当您开始添加继承时,它确实会让您更加困惑。我仍然觉得奇怪,你可以让一个类从另一个类继承,然后子类就可以实现了,但是在现实中,对象是相同的基类类型,这使得它们可以被推到某种集合上。
var list = new List<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());
}