C#泛型
约 299 字大约 1 分钟
2025-05-21
为了减少泛型造成的代码膨胀,CLR 会只编译一次泛型类的方法(待验证)。
List<String> 和 List<Stream> 中的编译的方法能共享,因为引用类型的变量都是指向堆上的 32/64 位的指针。
值类型大小不一,泛型生成的方法不能公用。即使大小一样 Int32 和 UInt32 也不能共用,因为生成的指令不一样。
泛型类型参数的限制
C# 泛型中的类型参数的操作数,无法应用操作符:
public static T sum<T>(T num) where T : struct
{
T sum = default(T);
for (T n = default(T); n < num; n++)
{
sum += n;
}
return sum;
}这个例子编译器会报错:
error CS0019: 运算符"<"无法应用于"T"和"T"类型的操作数error CS0023: 运算符"++"无法应用于"T"类型的操作数error CS0019: 运算符"+="无法应用于"T"和"T"类型的操作数
这有点反直觉。
泛型推导
少写参数?
泛型参数的协变逆变
public class MTest<in T>
// 这个模板参数能接受的类型,不限于 T 具体有哪些继承?需要讨论