C# 泛型約束(where)的使用小結(jié)
一、泛型約束 核心概念
1. 為什么需要泛型約束
普通泛型<T>:T 可以是任意類型,范圍太大,無(wú)法使用指定類型的專屬方法、屬性。
泛型約束:通過 where T : 約束條件,縮小泛型類型范圍,限制 T 只能是指定類型。
2. 約束語(yǔ)法
static void 方法名<T>(T 參數(shù)) where T : 約束條件
{
}
二、六大泛型約束
1. 無(wú)約束(任意類型)
語(yǔ)法:無(wú) where 條件
規(guī)則:T 可以是值類型、引用類型、自定義類、接口、數(shù)組任意類型
// 無(wú)任何限制的泛型方法
static void Test1<T>(T a)
{
Console.WriteLine("Test1");
}
2. 值類型約束struct
語(yǔ)法:where T : struct
規(guī)則:T 只能是值類型(int、double、bool、結(jié)構(gòu)體)
禁止:所有引用類型(string、數(shù)組、自定義類)
static void Test2<T>(T a) where T : struct
{
Console.WriteLine("Test1");
}
// 正確:int是值類型
Test2(10);
// 報(bào)錯(cuò):數(shù)組是引用類型,違反struct約束
// Test2(new int[] {1});
3. 引用類型約束class
語(yǔ)法:where T : class
規(guī)則:T 只能是引用類型(類、接口、數(shù)組、string)
禁止:所有值類型(int、double、bool)
static void Test3<T>(T a) where T : class
{
Console.WriteLine("Test1");
}
// 報(bào)錯(cuò):int是值類型
// Test3(10);
// 正確:string是引用類型
Test3("ss");
4. 無(wú)參構(gòu)造函數(shù)約束new()
語(yǔ)法:where T : new()
規(guī)則:T 類型 必須擁有無(wú)參構(gòu)造函數(shù)
適用場(chǎng)景:泛型方法內(nèi)部需要 new T() 實(shí)例化對(duì)象
static void Test4<T>(T a) where T : new()
{
Console.WriteLine("Test1");
}
// People類有無(wú)參構(gòu)造函數(shù),合法
Test4(new People());
注意:如果類只寫了有參構(gòu)造、沒有無(wú)參構(gòu)造,會(huì)直接報(bào)錯(cuò)。
5. 基類約束(父類約束)
語(yǔ)法:where T : 父類名
規(guī)則:T 只能是指定父類 或 父類的派生類
static void Test5<T>(T a) where T : People
{
Console.WriteLine("Test1");
}
Test5(new People()); // 父類本身
Test5(new Stu()); // 子類派生類,合法
6. 接口約束
語(yǔ)法:where T : 接口名
規(guī)則:T 必須是 實(shí)現(xiàn)了該接口的類 / 派生類
static void Test6<T>(T a) where T : IPeople
{
Console.WriteLine("Test1");
}
// SS類實(shí)現(xiàn)了IPeople接口,合法
Test6(new SS());
三、約束優(yōu)先級(jí)與組合規(guī)則
struct和class不能同時(shí)使用(互斥)new()必須放在所有約束的最后面- 可以多約束疊加:例如
where T : class, IPeople, new()
四、所有報(bào)錯(cuò)原因匯總
Test2(new int[]{1})報(bào)錯(cuò):數(shù)組是引用類型,Test2 約束必須是值類型 structTest3(10)報(bào)錯(cuò):int 是值類型,Test3 約束必須是引用類型 class
五、六大約束 終極對(duì)照表(背誦神器)
約束寫法 | 允許類型 | 禁止類型 |
|---|---|---|
無(wú)約束 | 全部類型 | 無(wú) |
struct | 所有值類型 | 引用類型(類、數(shù)組、string) |
class | 所有引用類型 | 值類型(int、bool、double) |
new() | 有無(wú)參構(gòu)造的類 | 無(wú)無(wú)參構(gòu)造的類 |
父類名 | 父類、子類 | 無(wú)關(guān)類、接口 |
接口名 | 實(shí)現(xiàn)該接口的類 | 未實(shí)現(xiàn)接口的類 |
六、滿分背誦口訣
- 無(wú)約束通吃所有,范圍最大最自由
- struct只吃值類型,數(shù)組類全報(bào)錯(cuò)
- class只吃引用類,數(shù)值類型進(jìn)不來
- new()要求無(wú)參構(gòu),實(shí)例化不報(bào)錯(cuò)
- 父類約束認(rèn)子孫,接口約束認(rèn)實(shí)現(xiàn)
到此這篇關(guān)于C# 泛型約束(where)的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# 泛型約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#借助Spire.Doc實(shí)現(xiàn)Word表格自動(dòng)排版
在日常開發(fā)中,利用C#自動(dòng)化生成Word報(bào)告是一項(xiàng)常見需求,本文將介紹使用 Spire.Doc for .NET 組件,通過C#代碼精確設(shè)置 C# Word 表格列寬,希望對(duì)大家有所幫助2026-02-02
C#使用Socket進(jìn)行簡(jiǎn)單的通訊的示例代碼
Socket 類是基于與 Linux、macOS 或 Windows 的本機(jī)互操作性提供的托管代碼版本的套接字服務(wù),提供了一系列的接口來支持應(yīng)用層的調(diào)用,下面我們就來學(xué)習(xí)一下如何使用Socket進(jìn)行簡(jiǎn)單的通訊,需要的可以參考下2023-12-12
基于WPF手寫一個(gè)簡(jiǎn)單的消息對(duì)話框
消息對(duì)話框是UI界面中不可或缺的組成部分,用于給用戶一些提示,警告或者詢問的窗口,本文將使用WPF手寫一個(gè)簡(jiǎn)單的消息對(duì)話框,感興趣的小伙伴可以了解下2023-12-12
WPF實(shí)現(xiàn)授權(quán)碼顯示密文并支持換行
這篇文章主要為大家詳細(xì)介紹了如何使用WPF實(shí)現(xiàn)授權(quán)碼顯示密文并支持換行,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2024-10-10

