泛型类必须显式声明类型参数如class mylist,漏写、未约束使用new t()或在实例化时省略具体类型均会编译失败;where约束决定t的操作权限;list与list运行时为不同类型。

泛型类定义必须带 T 类型参数声明
不声明类型参数就写 class MyList,编译器会报错:「使用泛型类型需要 <t></t>」。C# 要求所有泛型类显式声明类型形参,最简形式是 class MyList<t></t>,其中 T 是占位符(可换为 U、Item 等,但 T 是约定俗成的单字母命名)。
常见错误包括:
- 漏写
<t></t>直接在类体内用T—— 编译失败 - 在类名后加了
<t></t>,但方法里仍用object—— 失去泛型意义 - 把
T当具体类型写进字段初始化,如private T _value = new T();—— 除非加where T : new()约束,否则编译不通过
where 约束决定你能对 T 做什么操作
没有约束时,T 只能调用 object 的成员(如 ToString()、Equals()),不能调用 .Length、不能 new T()、不能用 > 比较。要解锁能力,必须加 where 子句:
-
where T : class→ 允许赋值为null,可用引用类型特有语法 -
where T : struct→ 限定为值类型,可安全使用default(T) -
where T : IComparable→ 支持CompareTo,可用于排序逻辑 -
where T : new()→ 允许在内部写new T() -
where T : BaseClass, IInterface→ 多重约束,用逗号分隔
注意:where T : IDisposable 不代表 T 实例能直接调用 Dispose() —— 必须用 using 或显式转型才生效。
实例化泛型类必须指定具体类型,不能留空
写 var list = new List(); 是非法的;C# 不支持“运行时推导泛型类型”。必须明确写出具体类型,例如:
var numbers = new List<int>(); var names = new Dictionary<string, Person>(); var stack = new Stack<DateTime>();
即使构造函数参数能推断类型(如 new List<int> { 1, 2, 3 }</int>),尖括号里的类型也不能省略。VS 有时会高亮建议“可简化”,但那是针对泛型方法的类型推导,不适用于类实例化。
千博购物系统.Net能够适合不同类型商品,为您提供了一个完整的在线开店解决方案。千博购物系统.Net除了拥有一般网上商店系统所具有的所有功能,还拥有着其它网店系统没有的许多超强功能。千博购物系统.Net适合中小企业和个人快速构建个性化的网上商店。强劲、安全、稳定、易用、免费是它的主要特性。系统由C#及Access/MS SQL开发,是B/S(浏览器/服务器)结构Asp.Net程序。多种独创的技术使
另一个易错点:把泛型类当普通基类用,比如写 MyList<t> obj = new MyList<string>();</string></t> —— 这里 T 未绑定,编译不过;左侧类型必须是已闭合的(closed)泛型,如 MyList<string></string>。
泛型类和非泛型类共存时,命名冲突需靠命名空间或别名隔离
如果已有非泛型类 Logger,又新增泛型类 Logger<t></t>,二者在同一命名空间下不冲突,可共存。但调用时若只写 new Logger(),编译器默认匹配非泛型版本。
若想强制使用泛型版,必须写全 new Logger<string>()</string>。更麻烦的是,当两个类在不同程序集、又被 using 引入时,可能触发歧义错误:
The type 'Logger' is defined in an assembly that is not referenced.
此时要么加完整命名空间前缀,要么用 using 别名:
using StringLogger = MyLib.Logger<string>;
泛型类型的元数据在编译期生成具体版本(JIT 时再特化),所以 List<int></int> 和 List<string></string> 在运行时是完全不同的类型,不能互相赋值,也不共享静态字段。








