C#中泛型约束(where)是什么?

转载自: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 提供的参数。



  1. T约定:只能是Access类型或者Access的子类型
  2. public class BaseAccess< T> where T : Access
  3. {
  4. }
  5. T约定:T只能传入接口的本身和实现了此接口的类
  6. public class BaseAccess< T> where T : IAggregateRoot
  7. {
  8. }
  9. 引用类型约束演示
  10. public class BaseAccess< T> where T : class
  11. {
  12. }
  13. 值类型约束演示
  14. public class BaseAccess< T> where T : struct
  15. {
  16. }
  17. 构造器约束(类型参数T必须有一个无参构造函数,并非BaseAccess必须有一个无参构造函数)
  18. public class BaseAccess< T> where T : new()
  19. {
  20. MongoContextAdapter _context;
  21. public BaseAccess(MongoContextAdapter context)
  22. {
  23. this._context = context;
  24. }
  25. }
  26. 一个类型占位符有两个约束 必须是引用类型,必须提供构造函数
  27. public class BaseAccess< T> where T : class, new()
  28. {
  29. }
  30. K必须约定是一个引用类型
  31. V必须约定是一个值类型
  32. public class BaseAccess< K, V>
  33. where K : class, new()
  34. where V : struct
  35. {
  36. }
  37. /// 泛型参数K必须继承V K,V必须是引用类型,必须提供构造函数
  38. public class BaseAccess< K, V>
  39. where K : V
  40. where K : class, new()
  41. where V : class, new()
  42. {
  43. }
  44. T约定:只能是Access类型或者Access的子类型
  45. public class BaseAccess< T> where T : Access
  46. {
  47. }
  48. T约定:T只能传入接口的本身和实现了此接口的类
  49. public class BaseAccess< T> where T : IAggregateRoot
  50. {
  51. }
  52. 引用类型约束演示
  53. public class BaseAccess< T> where T : class
  54. {
  55. }
  56. 值类型约束演示
  57. public class BaseAccess< T> where T : struct
  58. {
  59. }
  60. 构造器约束
  61. public class BaseAccess< T> where T : new()
  62. {
  63. MongoContextAdapter _context;
  64. public BaseAccess(MongoContextAdapter context)
  65. {
  66. this._context = context;
  67. }
  68. }
  69. 一个类型占位符有两个约束 必须是引用类型,必须提供构造函数
  70. public class BaseAccess< T> where T : class, new()
  71. {
  72. }
  73. K必须约定是一个引用类型
  74. V必须约定是一个值类型
  75. public class BaseAccess< K, V>
  76. where K : class, new()
  77. where V : struct
  78. {
  79. }
  80. /// 泛型参数K必须继承V K,V必须是引用类型,必须提供构造函数
  81. public class BaseAccess< K, V>
  82. where K : V
  83. where K : class, new()
  84. where V : class, new()
  85. {
  86. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值