Z
ZHANK
高级特性

泛型

泛型类/方法、where 约束、协变/逆变 out/in、default(T)

泛型

C# 泛型比 Java 更强大——支持值类型、运算符约束、协变/逆变。所有集合(List、Dictionary<K,V>)都是泛型。

学完本章你将: 掌握泛型类/方法、where 约束、协变/逆变。


泛型方法/类

csharp
// 泛型方法
T Max<T>(T a, T b) where T : IComparable<T>
    => a.CompareTo(b) > 0 ? a : b;

Console.WriteLine(Max(3, 5));       // 5
Console.WriteLine(Max(3.14, 2.72)); // 3.14

// 泛型类
public class Result<T>
{
    public bool Success { get; init; }
    public T? Data { get; init; }
    public string? Error { get; init; }
}

var result = new Result<int> { Success = true, Data = 42 };

where 约束

csharp
// class —— 引用类型
// struct —— 值类型
// new() —— 有无参构造
// BaseClass —— 继承关系
// IInterface —— 接口
// notnull / unmanaged

void Process<T>(T item) where T : class, new() { }

T Create<T>() where T : IComparable<T>, new()
{
    return new T();
}

协变 out / 逆变 in

csharp
// 协变(out)—— 子类 → 父类
IEnumerable<string> strs = new List<string>();
IEnumerable<object> objs = strs;  // ✅ string 是 object 的子类

// 逆变(in)—— 父类 → 子类
Action<object> objAction = o => Console.WriteLine(o);
Action<string> strAction = objAction;  // ✅ 能接受 object 就能接受 string