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 提供的引數。 |
- 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()
- {
- }
相關文章
- C#泛型約束C#泛型
- C# 泛型 介面約束C#泛型
- C# 泛型 引用型別約束 值型別約束C#泛型型別
- C# 泛型 基類約束C#泛型
- Go 泛型之泛型約束Go泛型
- C# 泛型 new()建構函式約束C#泛型函式
- 泛型的約束理解泛型
- 什麼是泛型泛型
- [譯]Kotlin泛型中何時該用型別形參約束?Kotlin泛型型別
- Java泛型(三):型別擦除帶來的約束與侷限性Java泛型型別
- C#中的泛型-1C#泛型
- 16.Kotlin星投影與泛型約束詳解Kotlin泛型
- 面試官:說說什麼是泛型的型別擦除?面試泛型型別
- C#泛型C#泛型
- C# 泛型C#泛型
- PHP中的型別約束介紹PHP型別
- java泛型中<?>和<T>有什麼區別?Java泛型
- 【.NET】利用 IL 魔法實現隨心隨意的泛型約束泛型
- C# 泛型方法C#泛型
- hashtable 泛型 C#泛型C#
- c#泛型集合C#泛型
- 學員優秀博文賞析:泛型萬用字元及約束泛型字元
- C#中的 int?是什麼意思C#
- Flutter學習:什麼是Container以及佈局約束的實現FlutterAI
- C#中將DataTable型別轉化為泛型集合C#型別泛型
- 深度學習中的Lipschitz約束:泛化與生成模型深度學習模型
- 淺談C#泛型C#泛型
- C#泛型學習C#泛型
- C# 泛型集合SortedListC#泛型
- c#泛型的使用C#泛型
- c#泛型續(一)C#泛型
- PHP7型別約束PHP型別
- C#中的介面和泛型集合探討C#泛型
- 什麼是智慧合約?
- 什麼是智慧合約
- 智慧合約是什麼
- Android約束佈局到底為什麼香?Android
- oracle中的約束Oracle