LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# 逆变和协变详解

admin
2024年12月2日 9:45 本文热度 325

C#中的逆变(Contravariance)协变(Covariance)是泛型特性中的重要概念,它们允许在泛型委托、泛型接口以及数组中进行更灵活的类型转换。以下是对C#中逆变和协变的详细解释:

一、协变(Covariance)

1.定义:协变是指在泛型类型的使用中,允许将某个类型参数替换为该参数的派生类(即更具体的类型)。换句话说,协变允许在泛型委托或接口中使用更具体的类型作为返回类型。

2.使用场景

  • 泛型委托:在使用委托时,协变允许将一个返回派生类的委托赋值给返回基类的委托。
  • 泛型接口:在定义泛型接口时,可以通过将类型参数声明为协变量(使用out关键字修饰)来支持协变。
  • LINQ查询:在LINQ查询中,可以使用协变来处理不同类型的集合。
  • 数组:数组支持协变,即派生程度更大的类型的数组能够隐式转换为派生程度更小的类型的数组(但此操作不是类型安全的)。

3.示例

// 基类public class Animal{    public virtual void Speak()    {        Console.WriteLine("Animal speaks");    }}
// 派生类public class Dog : Animal{    public override void Speak()    {        Console.WriteLine("Dog barks");    }}
// 定义一个协变的委托public delegate T AnimalDelegate<out T>();
class Program{    static void Main()    {        // 将返回Dog类型的委托赋值给返回Animal类型的委托        AnimalDelegate<Animal> animalDelegate = GetDog;        Animal animal = animalDelegate();        animal.Speak(); // 输出: Dog barks    }
   static Dog GetDog()    {        return new Dog();    }}

二、逆变(Contravariance)

1.定义:逆变是指在泛型类型的使用中,允许将某个类型参数替换为该参数的基类(即更不具体的类型)。这种特性通常在需要处理不同类型的对象时非常有用,特别是在方法参数时。

2.使用场景

  • 泛型委托:在使用委托时,逆变允许将一个接受派生类的委托赋值给接受基类的委托。
  • 泛型接口:在定义泛型接口时,可以通过将类型参数声明为逆变量(使用in关键字修饰)来支持逆变。
  • 事件处理:在事件处理程序中,可以使用逆变来处理不同类型的事件。

3.示例

// 基类public class Animal{    public string Name { get; set; }}
// 派生类public class Dog : Animal {}
// 定义一个逆变的委托public delegate void AnimalAction<in T>(T animal);
class Program{    static void Main()    {        // 将接受Animal类型的委托赋值给接受Dog类型的委托        AnimalAction<Animal> animalAction = MakeSound;        Dog dog = new Dog { Name = "Buddy" };        animalAction(dog); // 输出: Buddy makes a sound    }
   static void MakeSound(Animal animal)    {        Console.WriteLine($"{animal.Name} makes a sound");    }}

三、注意事项

  1. 逆变和协变只支持引用类型,不支持值类型。
  2. 如果泛型接口或泛型委托的类型参数被声明为协变或逆变,则该泛型接口或泛型委托被称为变体(Variant)。
  3. 数组只支持协变,不支持逆变。
  4. 协变和逆变可以提高代码的灵活性和可重用性,但也可能引入类型安全问题,因此在使用时应谨慎。

该文章在 2024/12/2 9:45:34 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved