转载自:C#中泛型约束where是什么
泛型约束: 确保泛型类使用的参数是提供特定方法的类型。
详见:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/generics/generic-classes
约束 | 说明 |
T:结构 | 类型参数必须是值类型。 |
T:类 | 类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。 |
T:new() | 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 |
T:<基类名> | 类型参数必须是指定的基类或派生自指定的基类。 |
T:<接口名称> | 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 |
T:U | 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。 |
-
T约定:只能是Access类型或者Access的子类型
-
public class BaseAccess< T> where T : Access
-
{
-
}
-
-
-
T约定:T只能传入接口的本身和实现了此接口的类
-
public class BaseAccess< T> where T : IAggregateRoot
-
{
-
}
-
-
引用类型约束演示
-
public class BaseAccess< T> where T : class
-
{
-
}
-
-
值类型约束演示
-
public class BaseAccess< T> where T : struct
-
{
-
}
-
-
构造器约束(类型参数T必须有一个无参构造函数,并非BaseAccess必须有一个无参构造函数)
-
public class BaseAccess< T> where T : new()
-
{
-
MongoContextAdapter _context;
-
public BaseAccess(MongoContextAdapter context)
-
{
-
this._context = context;
-
}
-
}
-
-
一个类型占位符有两个约束 必须是引用类型,必须提供构造函数
-
public class BaseAccess< T> where T : class, new()
-
{
-
-
-
}
-
-
K必须约定是一个引用类型
-
V必须约定是一个值类型
-
public class BaseAccess< K, V>
-
where K : class, new()
-
where V : struct
-
{
-
-
-
}
-
-
-
/// 泛型参数K必须继承V K,V必须是引用类型,必须提供构造函数
-
public class BaseAccess< K, V>
-
where K : V
-
where K : class, new()
-
where V : class, new()
-
{
-
}
-
-
-
-
T约定:只能是Access类型或者Access的子类型
-
public class BaseAccess< T> where T : Access
-
{
-
}
-
-
-
T约定:T只能传入接口的本身和实现了此接口的类
-
public class BaseAccess< T> where T : IAggregateRoot
-
{
-
}
-
-
引用类型约束演示
-
public class BaseAccess< T> where T : class
-
{
-
}
-
-
值类型约束演示
-
public class BaseAccess< T> where T : struct
-
{
-
}
-
-
构造器约束
-
public class BaseAccess< T> where T : new()
-
{
-
MongoContextAdapter _context;
-
public BaseAccess(MongoContextAdapter context)
-
{
-
this._context = context;
-
}
-
}
-
-
一个类型占位符有两个约束 必须是引用类型,必须提供构造函数
-
public class BaseAccess< T> where T : class, new()
-
{
-
-
-
}
-
-
K必须约定是一个引用类型
-
V必须约定是一个值类型
-
public class BaseAccess< K, V>
-
where K : class, new()
-
where V : struct
-
{
-
-
-
}
-
-
-
/// 泛型参数K必须继承V K,V必须是引用类型,必须提供构造函数
-
public class BaseAccess< K, V>
-
where K : V
-
where K : class, new()
-
where V : class, new()
-
{
-
}