c#泛型约束

泛型约束概念

关键字 where

值类型 where T:struct

让泛型的类型有一定的限制

1值类型 where 泛型字母 struct

2引用类型 where 泛型字母 class

3存在无参公共构造函数 where 泛型字母 new()

4某个类本身或者其他派生类 where 泛型字母 类名

5某个接口的派生类型 where 泛型字母 接口名

6另一个泛型类本身或者派生类型 where 泛型字母 另一个泛型字母

各泛型约束讲解

值类型约束

cs 复制代码
class Test1<T> where T:struct
{
    public T value;

    public void TestFun<K>(K v) where K:struct
    {
    }
}
   Test1<int> t1 = new Test1<int>();
   t1.TestFun<float>(1.3f);

引用类型约束

cs 复制代码
class Test2<T> where T:class
{
    public T value;
    public void TestFun<K>(K k) where K:class
    {
    }
}
Test2<Random> t2 = new Test2<Random>();
t2.value = new Random();
t2.TestFun<object>(new object());

公共无参构造约束

cs 复制代码
 class Test3<T> where T:new()
 {
     public T value;

     public void TestFun<K>(K k) where K : new()
     {

     }
 }
 class Test1
 {
     public Test1()
     {

     }
 }

 class Test2
 {
     public Test2(int a)
     {

     }
 }
Test3<Test1> t3 = new Test3<Test1>();

类约束

cs 复制代码
class Test4<T> where T : Test1
{
    public T value;

    public void TestFun<K>(K k) where K : Test1
    {

    }
}

class Test3:Test1
{

}
Test4<Test3> t4 = new Test4<Test3>();

接口约束

cs 复制代码
interface IFly
{

}

interface IMove:IFly
{

}

class Test4:IFly
{

}

class Test5<T> where T : IFly
{
    public T value;

    public void TestFun<K>(K k) where K : IFly
    {

    }
}
Test5<IMove> t5 = new Test5<IMove>();
t5.value = new Test4();

另一个泛型约束

类型参数 T 必须继承自另一个类型参数 U

cs 复制代码
class Test6<T,U> where T : U
{
    public T value;

    public void TestFun<K,V>(K k) where K : V
    {

    }
}
Test6<Test4, IFly> t6 = new Test6<Test4, IFly>();

约束的组合使用

cs 复制代码
class Test7<T> where T: class,new()
{

}

多个泛型有约束

cs 复制代码
    class Test8<T,K> where T:class,new() where K:struct
    {

    }
相关推荐
Artech2 小时前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf2 天前
C#摸鱼实录——IoC与DI案例详解
c#
咕白m6252 天前
使用 C# 在 Excel 中应用多种字体样式
后端·c#
Artech2 天前
[MAF预定义的AIContextProvider-02]AgentSkillsProvider——将Agent Skills引入MAF
ai·c#·agent·agent skills·maf
LDR0063 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园3 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob3 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
源分享3 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm
Luminous.3 天前
C语言--day30
c语言·开发语言