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

时间:2014-04-21 22:07:56

标签: c# generics

我正在研究一些教室的例子。这段代码有效,但我不明白为什么它有效。我知道有一个泛型类型,该类实现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>());
}

4 个答案:

答案 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>也可以}}

部分混淆可能源于您为不同的类使用类似的类型名称(ItemItem<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;。