Skip to content

C#泛型

约 299 字大约 1 分钟

2025-05-21

为了减少泛型造成的代码膨胀,CLR 会只编译一次泛型类的方法(待验证)。

List<String>List<Stream> 中的编译的方法能共享,因为引用类型的变量都是指向堆上的 32/64 位的指针。

值类型大小不一,泛型生成的方法不能公用。即使大小一样 Int32UInt32 也不能共用,因为生成的指令不一样。

泛型类型参数的限制

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 具体有哪些继承?需要讨论