官方文档:where(泛型类型约束)- C# 参考 - C# | Microsoft Learn
泛型定义中的 where
子句指定对用作泛型类型、方法、委托或本地函数中类型参数的参数类型的约束,约束必须位于任何声明的基类或实现的接口之后。
常用的约束类型有值类型,引用类型,new() 和 自定义类型
// 值类型约束
class MyClass<T> where T : struct {} // T必须为值类型
// 引用类型约束
class MyClass<T> where T : class {} // T必须为引用类型
// new 约束
class MyClass<T> where T : new() // 类型参数T必须具有可访问的无参数构造函数
// 自定义类型约束
class MyClass<T> where T : Base // 类型参数T为Base的基类及其派生类,Base为用户自定义类型
// compare约束 参数 T 实现比较接口
class MyClass<T> where T : IComparable
{
public int CompareTo(object obj)
{
// 小于零 此实例在排序顺序中位于 obj 之前。 零 顺序相同
return 0;
}
}
// 当与其他约束一起使用时,new() 约束必须最后指定,例:单例泛型(单线程)
public class Singleton<T> where T : class, new()
{
private static T _instance = null;
public static T GetInstance()
{
if (_instance == null)
{
_instance = new T();
}
return _instance;
}
}
不常用的类型约束
// unmanaged约束
public class MyClass<T, Y> where T : unmanaged
where Y : class
{}
/*
该约束不支持与 struct、class、 new() 约束共用,它所支持的类型包括以下几点:
1 类型为 sbyte、byte、short、ushort、int、uint、long、ulong、char、float、double、
decimal、bool、IntPtr 或 UIntPtr
2 可以是枚举类型
3 可以是指针类型
4 可以是符合非托管约束的自定义结构(结构的内部字段成员符合以上要求)
*/
where 用于查询表达式做约束条件
int[] nums = { 4, 6, 7, 8, 99, 11, 0 };
var selectNums = from num in nums
where num < 50 && num % 2 == 0
select num;
foreach(int val in selectNums)
{
// ..
}