C#泛型

本文深入探讨了C#中的泛型应用,包括泛型类、结构、接口、委托和方法的声明与使用。讲解了如何通过where语句对类型参数进行约束,并介绍了泛型方法、接口的实现方式。此外,还解析了协变与逆变的概念,帮助读者全面理解泛型在C#中的强大功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

泛型能实现逻辑的重复使用。C#提供5种泛型类、结构、接口、委托和方法。

1.声明泛型类

  声明泛型类和普通类差不多

        public class mytest<T1,T2>{

      public T1 somevar=new T1();

      public T2 othervar=new T2();

    }

  构造类型则在构造函数中

    mytest<int,long>{}

  变量声明:

    mytest<int,long> t=new mytest<int,long>();

    var t=new mytest<int,long>();

2.用where语句进行约束

  关键字 约束列表

    where TypeParam : constraint , constraint

  类型参数

  共有五种类型参数:

  约束类型 描述

  类名 只有这个类型的类,或者继承这个类型

  class 任何引用类型,包括类、数组、委托和接口都可以用作类型实例

  struct 任何值类型都可以用作类型实参

  接口名 只有这个接口或实现这个接口

  new() 任何带有无参公共构造函数的类型。这叫做构造类型约束

3.泛型方法

  与其他泛型不一样方法是成员,可以在泛型与非泛型中实现

    public void PrintfData<S,T>(S p,T t)where S:person{}

  调用泛型方法:

    Mymethod<short,int>();

  推断类型,如果只有一个参数则

    public vod test<T>(T t1);

    int t=5;

    test(t);

4.泛型接口

  interface IMyFc<T>{

  T ReturnIt(T value);}

  class test<S>:IMyfc<S>{

  public S ReturnIt(S invalue){

    return invalue;}

5.可变性

  协变:( 需要添加关键字 out )能让基类泛型引用连接到派生类泛型引用,如果在有派生类关键字只需要加在派生类,逆变一样。

    class Animal{

      public int legs=4;}

    class Dog:Animal{}

    delegate T Factory<T>();    <—factory委托

    class Program{

      static Dog MakeDog(){

      return new Dog();}       <—符合Factory委托

    static void main(){

      Factory<Dog>dog=d;

      Factory<Animal>ani=dog;//报错

    }

  兼容性原则在这个例子不适用,俩个委托同级。我们需要一个Animal对象,返回一个dog的引用也可以变成Animal,但委托需要的是Animal,所以委托不匹配。如果派生类只用于输出值,这种结构化的委托有效性的常数之间关系叫做协变。

  在delegate T Factory<out T>();添加out参数

  逆变:(需要添加关键字 in)能够让派生类泛型连接基类泛型引用

    class Animal{

      public int legs=4;}

    class Dog:Animal{}

    delegate void Action<in T>(); <-in 逆变关键字

    class Program{

      static void Anto(Animal a){

        Console.WriteLine(“{0}”,a.Legs);}

      static void main(){

      Action<Animal>act1=Anto;

      Action<DOg> dog1=act1;

      dog1(new dog());

    }

  协变:因为像期望那样,调用获得了一个指向基类的引用。

  逆变:因为像期望那样,被调用的方法收到了一个基类的引用。

转载于:https://www.cnblogs.com/dlvguo/p/9688412.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值