新手初次接触泛型,理解比较吃力。下面是网上一片文章的一部分,希望各位前辈能解答下。//MyList.cs
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace CLRSupportExample
{
 public class MyList<T>
 {
  private static int objCount = 0;
  public MyList()
  {objCount++; }
  public int Count
  {
   get
    {return objCount; }
  }
 }
}
//Program.cs
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
#endregion
namespace CLRSupportExample
{
 class SampleClass {}
 class Program
 {
  static void Main(string[] args)
  {
   MyList<int> myIntList = new MyList<int>();
   MyList<int> myIntList2 = new MyList<int>();
   MyList<double> myDoubleList = new MyList<double>();
   MyList<SampleClass> mySampleList = new MyList<SampleClass>();
   Console.WriteLine(myIntList.Count);
   Console.WriteLine(myIntList2.Count);
   Console.WriteLine(myDoubleList.Count);
   Console.WriteLine(mySampleList.Count);
   Console.WriteLine(new MyList<sampleclass>().Count);
   Console.ReadLine();
  }
 }
}得到结果
2
2
1
1上面2个为什么说2呢?

解决方案 »

  1.   

    MyList<int> myIntList = new MyList<int>();
                MyList<int> myIntList2 = new MyList<int>();运行了两次
      

  2.   

    我知道为什么,因为objCount是static的。
    找到了2篇文章,有需要的可以看下。
    http://blog.163.com/wangpeng126_2009@126/blog/static/1210226112010515113826356/
    http://www.360doc.com/content/11/0314/22/3705007_101160628.shtml
    有没有大牛再来讲下关于 泛型 的知识,不胜感激!
      

  3.   

    这个问题不要问大牛 连小牛都不用问  还是我来回答吧
    泛型没什么复杂的 举个简单且常见的泛型List<T> 就是这种   T表示任何类型的数据   比如List<String>  表示定义了一个可以存储或返回String类型的List集合  这个List是系统自由的应该好理解吧   当然你也可以自己定义  就好比你的例子MyList<T> 表示可以存储或返回任何类型的MyList集合接下来看下结果,在看之前你注意这条语句private static int objCount = 0;
    这是个静态变量  相同类型的参数只会执行一便
    MyList<int> myIntList = new MyList<int>();  //传递过去的是int类型 objCount+1
    MyList<int> myIntList2 = new MyList<int>(); // 传过去的还是int类型  objCount再+1
    所以  输出的值就为2了
    MyList<double> myDoubleList = new MyList<double>();  //传递过去的是double类型 那么重新执行一下 private static int objCount = 0;   且objCount+1
    MyList<SampleClass> mySampleList = new MyList<SampleClass>(); //同理传过去的类型又变了  所以又执行一下private static int objCount = 0;  且objCount+1所以后面的输出就是2,2,1,1 了   那么最后一个2又是怎么来的呢  
    Console.WriteLine(new MyList<sampleclass>().Count);
    那是因为再输出之前又一次实例化了sampleclass 这个类型  所以 在上一次的objCount再+1  
    所以输出2了
      

  4.   


    MyList<int>是一种类型,MyList<double>是一种类型,MyList<Bitmap>是一种集合,MyList<Image>也是一种类型,而且它们都毫无关系。尽管Image是Bitmap的父类,但是后边两个类型则毫无继承关系(现在.net支持泛型的协变和逆变,但是仅限于接口声明中特定的地方作为声明,并不能用于实际创造类型)。注意MyList不是任何一种类型,你可以定义一种叫做MyList的类型,但是带上<...>就跟不带它完全不同的意思了。MyList<T>类似于代码生成器(宏、模板),它用于动态产生类型。数学上,你可以说它是一种类型映射机制,即输入类型参数,输出新的类型。但是它自己并不是类型。
      

  5.   

    MyList<Bitmap>是一种集合  -->  MyList<Bitmap>是一种类型
    因此在lz的Main代码中,分别使用了三种类型,来创建了5个类型实例(对象)。把泛型的名称跟类型分开,这是关键。如果你认为泛型名称相同的东西都是同一个类型,你就糊涂了!