码迷,mamicode.com
首页 > Windows程序 > 详细

C#泛型

时间:2018-09-21 21:16:19      阅读:205      评论:0      收藏:0      [点我收藏+]

标签:nim   构造函数   constrain   构造   派生类   interface   turn   return   实现   

泛型能实现逻辑的重复使用。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());

    }

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

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

C#泛型

标签:nim   构造函数   constrain   构造   派生类   interface   turn   return   实现   

原文地址:https://www.cnblogs.com/dlvguo/p/9688412.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!