C# 泛型約束(where)的使用小結(jié)
一、泛型約束 核心概念
1. 為什么需要泛型約束
普通泛型<T>:T 可以是任意類型,范圍太大,無法使用指定類型的專屬方法、屬性。
泛型約束:通過 where T : 約束條件,縮小泛型類型范圍,限制 T 只能是指定類型。
2. 約束語法
static void 方法名<T>(T 參數(shù)) where T : 約束條件
{
}
二、六大泛型約束
1. 無約束(任意類型)
語法:無 where 條件
規(guī)則:T 可以是值類型、引用類型、自定義類、接口、數(shù)組任意類型
// 無任何限制的泛型方法
static void Test1<T>(T a)
{
Console.WriteLine("Test1");
}
2. 值類型約束struct
語法: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);
// 報錯:數(shù)組是引用類型,違反struct約束
// Test2(new int[] {1});
3. 引用類型約束class
語法:where T : class
規(guī)則:T 只能是引用類型(類、接口、數(shù)組、string)
禁止:所有值類型(int、double、bool)
static void Test3<T>(T a) where T : class
{
Console.WriteLine("Test1");
}
// 報錯:int是值類型
// Test3(10);
// 正確:string是引用類型
Test3("ss");
4. 無參構(gòu)造函數(shù)約束new()
語法:where T : new()
規(guī)則:T 類型 必須擁有無參構(gòu)造函數(shù)
適用場景:泛型方法內(nèi)部需要 new T() 實例化對象
static void Test4<T>(T a) where T : new()
{
Console.WriteLine("Test1");
}
// People類有無參構(gòu)造函數(shù),合法
Test4(new People());
注意:如果類只寫了有參構(gòu)造、沒有無參構(gòu)造,會直接報錯。
5. 基類約束(父類約束)
語法:where T : 父類名
規(guī)則:T 只能是指定父類 或 父類的派生類
static void Test5<T>(T a) where T : People
{
Console.WriteLine("Test1");
}
Test5(new People()); // 父類本身
Test5(new Stu()); // 子類派生類,合法
6. 接口約束
語法:where T : 接口名
規(guī)則:T 必須是 實現(xiàn)了該接口的類 / 派生類
static void Test6<T>(T a) where T : IPeople
{
Console.WriteLine("Test1");
}
// SS類實現(xiàn)了IPeople接口,合法
Test6(new SS());
三、約束優(yōu)先級與組合規(guī)則
struct和class不能同時使用(互斥)new()必須放在所有約束的最后面- 可以多約束疊加:例如
where T : class, IPeople, new()
四、所有報錯原因匯總
Test2(new int[]{1})報錯:數(shù)組是引用類型,Test2 約束必須是值類型 structTest3(10)報錯:int 是值類型,Test3 約束必須是引用類型 class
五、六大約束 終極對照表(背誦神器)
約束寫法 | 允許類型 | 禁止類型 |
|---|---|---|
無約束 | 全部類型 | 無 |
struct | 所有值類型 | 引用類型(類、數(shù)組、string) |
class | 所有引用類型 | 值類型(int、bool、double) |
new() | 有無參構(gòu)造的類 | 無無參構(gòu)造的類 |
父類名 | 父類、子類 | 無關(guān)類、接口 |
接口名 | 實現(xiàn)該接口的類 | 未實現(xiàn)接口的類 |
六、滿分背誦口訣
- 無約束通吃所有,范圍最大最自由
- struct只吃值類型,數(shù)組類全報錯
- class只吃引用類,數(shù)值類型進不來
- new()要求無參構(gòu),實例化不報錯
- 父類約束認子孫,接口約束認實現(xiàn)
到此這篇關(guān)于C# 泛型約束(where)的使用小結(jié)的文章就介紹到這了,更多相關(guān)C# 泛型約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#借助Spire.Doc實現(xiàn)Word表格自動排版
在日常開發(fā)中,利用C#自動化生成Word報告是一項常見需求,本文將介紹使用 Spire.Doc for .NET 組件,通過C#代碼精確設(shè)置 C# Word 表格列寬,希望對大家有所幫助2026-02-02

