泛型约束: 确保泛型类使用的参数是提供特定方法的类型。
详见: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
{
}
构造器约束
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()
{
}
本文详细介绍了C#中泛型约束的概念及其用法,包括如何限制泛型类型的使用范围,例如限定为引用类型、值类型或是实现特定接口或继承自特定基类的类型。此外还展示了不同约束条件的实际应用案例。
378

被折叠的 条评论
为什么被折叠?



