日期:2014-05-17  浏览次数:20781 次

请教一下泛型的问题
这问一下泛型以接口作为类是什么意思呢?

------解决方案--------------------
引用:
我想说泛型的接口,比如 IEnumerable<User> 这种


这有什么不理解的呢?

就是说,一个类,必须实现这个接口的方法,这一点和普通接口一样,同时,你可以选择作为一个泛型类保留泛型类型参数,或者将这些参数用具体的类型指定。
------解决方案--------------------
引用:
我的思想太守旧,有些新概念还没接受,为什么接口可以作为一个泛型?

泛型不是动态类型,而是静态的。
你首先需要确认的是,泛型是设计时概念。就是说在编译时泛型的具体类型都是已经明确的。所以,接口为什么不能是泛型?
------解决方案--------------------
我的理解T就是个占位符,类似于 string.Format("{0}",xx),中的{0}
编译器编译的时候把T替换成你的类型,所以T可以是任何类型,除非你限定他。

我猜的,没深入研究VS的编译器底层到底是怎么工作的
------解决方案--------------------
引用:
但是泛型如果不是动态,为什么List<T> 可以是List<int>又可以List<string>呢


你可以把List<int>想象成一个叫List_int的类,而List<string>是List_string的类。
那么List_int这个类不是你定义的,而是CLR根据你的List<T>的定义,将int代入后合成的。

它完成了一个自动化的过程。
好比,你买了一本“C#标准代码实现大全”的书,上面有个例子:
通用List实现
class List_什么类型
{
    public void Add(什么类型 obj) { ... }
    public 什么类型 IndexOf(int number) { ... }
    ...
}
好了,现在让你实现一个叫List_int的类,你拿出了书,找到这么一个标准规范的写法,照抄了一次。
然后你把什么类型全部替换为int。
class List_int
{
    public void Add(int obj) { ... }
    public int IndexOf(int number) { ... }
    ...
}
然后你使用它
List_int list = new List_int();
list.Add(1);
list.Add(2);
...
现在告诉你,有一种方法,可以让编译器自动根据一个套路去生成List_xxx这个类,这个方法就是泛型。