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#泛型
- Go 泛型之泛型約束Go泛型
- 泛型的約束理解泛型
- [譯]Kotlin泛型中何時該用型別形參約束?Kotlin泛型型別
- Java泛型(三):型別擦除帶來的約束與侷限性Java泛型型別
- 【C#】-泛型C#泛型
- C#泛型C#泛型
- C# 泛型C#泛型
- where 1=1 是什麼鬼?
- C#泛型集合C#泛型
- 面試官:說說什麼是泛型的型別擦除?面試泛型型別
- 【.NET】利用 IL 魔法實現隨心隨意的泛型約束泛型
- 深度學習中的Lipschitz約束:泛化與生成模型深度學習模型
- java泛型中<?>和<T>有什麼區別?Java泛型
- 學員優秀博文賞析:泛型萬用字元及約束泛型字元
- 淺談C#泛型C#泛型
- C#泛型學習C#泛型
- Flutter學習:什麼是Container以及佈局約束的實現FlutterAI
- C#中的介面和泛型集合探討C#泛型
- 詳解C#泛型(一)C#泛型
- 詳解C#泛型(三)C#泛型
- 詳解C#泛型(二)C#泛型
- C# 泛型中的資料型別判定與轉換C#泛型資料型別
- Android約束佈局到底為什麼香?Android
- 【SQL】15 SQL 約束(Constraints)、NOT NULL 約束、UNIQUE 約束、PRIMARY KEY 約束、FOREIGN KEY 約束、CHECK 約束、DEFAULT約束SQLAINull
- 資料型別與約束資料型別
- Typescript 中的泛型是什麼 - 為什麼使用它們,它們如何與程式碼示例一起使用TypeScript泛型
- C#泛型鍵值對集合C#泛型
- C#基礎:泛型委託C#泛型
- 理解C#泛型運作原理C#泛型
- C#學習 [型別系統] 泛型(16)C#型別泛型
- C# 泛型集合的自定義型別排序C#泛型型別排序
- 什麼是智慧合約?
- 智慧合約是什麼
- 資料庫中欄位資料型別以及約束資料庫資料型別
- 什麼是C#反射(Reflection)C#反射
- C#類繼承自泛型集合C#繼承泛型
- c#——泛型的多種應用C#泛型