C#系列之泛型约束

目录

1.什么是泛型约束?

泛型约束有6种:

2.各泛型约束讲解

值类型约束

引用类型约束

无参公共构造函数约束

类约束

接口约束

另一个泛型约束

3.约束的组合使用

通过逗号组合使用

4.多个泛型约束


1.什么是泛型约束?

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

关键字:where

泛型约束有6种:

值类型     where泛型字母:struct

引用类型    where泛型字母:class

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

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

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

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

2.各泛型约束讲解

值类型约束
class Test1<T> where T:struct
{
  public T value;
  public void TestFun<K>(K v) where K:struct
  {
  
  }
}
t.TestFun("123");
t.TestFun<float,double>(1.4f);
Test1<int> t1=new Test<int>();
t1.TestFun<float>(1.3f);
引用类型约束
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());
无参公共构造函数约束

①必须是无参构造函数,如果结构体中编写有参函数,无参构造函数不会被顶替。

②必须是公共的

③必须是非抽象类型,因为抽象类型不能够去new它。

类约束

必须是子类或者派生类才不会报错

class Test4<T> where T:Test1

{

 public T value;

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

  {

  }

}

接口约束

class Test4:IFly

{

}

class Test5<T> where T:IFly

{

 public T value;

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

{

}

}

某个接口的派生类

另一个泛型约束
class Test6<T,U>where T:U
{
 public T value;
 public void TestFun<K k> where K;V
  {
  }
}

3.约束的组合使用

通过逗号组合使用
class Test7<T> where T:class,new()
{ 

}

4.多个泛型约束

class Test8<T,K> where T:class,new() whereK:struct
{

}

注意:多个泛型约束用where连接即可。

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C#中,可以使用泛型来指定一个类的基类,同时也可以使用泛型约束来限制泛型类型参数的类型。通过泛型的基类和泛型约束,可以实现更加灵活和可复用的代码。 以下是一个示例代码,演示了如何定义一个泛型类,并指定其基类以及泛型约束: ```csharp public class MyBaseClass { public void BaseMethod() { Console.WriteLine("BaseMethod called."); } } public class MyGenericClass<T> : MyBaseClass where T : SomeType { public void GenericMethod(T item) { Console.WriteLine("GenericMethod called."); // 可以访问 MyBaseClass 中的成员 BaseMethod(); // 可以使用 T 类型的参数 item 进行操作 Console.WriteLine($"Item: {item}"); } } ``` 在上面的示例中,`MyBaseClass` 是一个基类,`BaseMethod` 是其成员方法。`MyGenericClass<T>` 是一个泛型类,泛型类型参数 `T` 受到 `SomeType` 泛型约束限制,并且继承自 `MyBaseClass`。在 `MyGenericClass<T>` 中,可以访问 `MyBaseClass` 的成员方法,并且使用 `T` 类型的参数进行操作。 使用示例代码: ```csharp MyGenericClass<int> instance = new MyGenericClass<int>(); instance.GenericMethod(42); ``` 在上面的代码中,我们创建了一个 `MyGenericClass<int>` 的实例,并调用了 `GenericMethod` 方法,传入了整数类型的参数 `42`。输出结果如下: ``` GenericMethod called. BaseMethod called. Item: 42 ``` 总结起来,通过在泛型类中指定基类和泛型约束,可以使泛型类继承自指定的基类,并对泛型类型参数进行类型约束,提供更加灵活和可复用的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Nicole Potter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值