泛型
泛型类/方法、where 约束、协变/逆变 out/in、default(T)
泛型
C# 泛型比 Java 更强大——支持值类型、运算符约束、协变/逆变。所有集合(List
学完本章你将: 掌握泛型类/方法、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