C#中泛型約束(where)是什麼?

兵工廠三劍客發表於2018-07-11
轉載自: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. }

相關文章