【问题标题】:Why does this code work for different types?为什么此代码适用于不同类型?
【发布时间】:2014-04-23 03:20:49
【问题描述】:

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

我确定它与通用有关,但为什么我不确定。

问题:为什么这段代码允许两种不同的类型进入同一个列表?

类定义:

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>());
}

【问题讨论】:

  • 提示:T 是一个类型参数。想想这两个词是什么意思。
  • 代码太多了。尽量使问题代码简短而切题。
  • Item、Item 和 Item 都是 Item 的继承。由于您将 Item 存储在集合中,因此它们都可以存储。
  • 我已将您的代码剥离回相关部分。

标签: c# generics


【解决方案1】:

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

public class Item<T> : Item

这个类的定义表明Item&lt;T&gt;总是继承Item,不管T是什么类型。这意味着,当您创建 List&lt;Item&gt;...

var list = new List<Item>();

...您可以向其添加 any Item&lt;T&gt;,因为任何 Item&lt;T&gt; 都是 Item

【讨论】:

    【解决方案2】:

    为什么这段代码允许 int 和 double 进入同一个列表。

    之所以有效,是因为您存储的是 Item,而不是 Item&lt;T&gt;

    这个等价的代码更容易看:

    //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);
    

    【讨论】:

    • 在此处查看您的操作方式要简单得多。有时,当您开始添加继承时,它确实会变得更加混乱。我仍然觉得奇怪的是,您可以让一个类从另一个类继承,然后可以实现子类,但实际上对象的对象是相同的基类类型,因此它们可以被推送到集合中某种意义上的。
    【解决方案3】:

    之所以有效,是因为Item&lt;T&gt; 一个Item,所以Item&lt;double&gt;可以放在List&lt;Item&gt;中,Item&lt;int&gt;也可以

    部分混淆可能源于您为不同的类使用相似的类型名称(ItemItem&lt;T&gt;)。尽管在您的情况下,一个继承自另一个,但类与该类的通用版本之间没有内置连接。

    【讨论】:

      【解决方案4】:

      您的示例中令人困惑的是基类和派生类都具有标签“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&lt;&gt; 是基本类型的容器,在本例中为“Pet” - 在您的示例中基本类型为“Item”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 2019-08-28
        • 1970-01-01
        • 1970-01-01
        • 2022-01-14
        相关资源
        最近更新 更多