我正在研究一些教室的例子。这段代码有效,但我不明白为什么它有效。我知道有一个泛型类型,该类实现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>());
}
答案 0 :(得分:7)
这里的混淆源于你有两个泛型类型,而不是一个。第一个是通用列表,您已经了解。第二个是通用的Item
类:
public class Item<T> : Item
此类的定义指出Item<T>
始终会继承Item
,无论T
是什么类型。这意味着,当您创建List<Item>
...
var list = new List<Item>();
...您可以向其添加任何 Item<T>
,因为任何Item<T>
都是Item
。
答案 1 :(得分:4)
为什么这段代码允许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);
答案 2 :(得分:2)
它有效,因为Item<T>
是Item
,因此Item<double>
可以放在List<Item>
中,Item<int>
也可以}}
部分混淆可能源于您为不同的类使用类似的类型名称(Item
和Item<T>
)。虽然在你的情况下,一个继承自另一个,但是类和该类的通用版本之间没有内置连接。
答案 3 :(得分:1)
你的例子中令人困惑的是,基类和派生类都有标签&#34; Item&#34;。但是,通过一些名称更改,您的代码相当于:
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<>
是基类型的容器,在这种情况下&#34; Pet&#34; - 在您的示例中,基本类型为&#34;项目&#34;。