首页 > 其他分享 >in 和逆变有关系吗

in 和逆变有关系吗

时间:2024-07-29 21:50:50浏览次数:9  
标签:关系 关键字 逆变 泛型 类型 参数 IMyInterface

in 关键字与逆变(contravariance)有一定的关系,但它们在C#中的用途和应用场景是不同的。让我们先澄清这两个概念:

逆变(Contravariance)

逆变是指泛型类型参数的一种变异性,它允许一个类型参数的协变类型(covariant type)与该类型参数的逆变类型(contravariant type)之间存在一种特定的关系。在C#中,逆变主要用于委托和接口的泛型参数。

逆变的基本原理是:如果 T 是一个逆变类型参数,那么 T 的子类型可以作为 T 的父类型使用。换句话说,如果 T 是逆变的,那么 T 的子类型可以替换 T 的父类型的位置。

示例

在C#中,逆变可以通过将泛型约束设置为 in T 来实现:

using System;

delegate void MyDelegate<in T>(T item);

interface IMyInterface<in T>
{
    void Add(T item);
}

class Program
{
    static void Main()
    {
        MyDelegate<int> delInt = ItemHandler;
        MyDelegate<object> delObj = delInt; // 逆变

        IMyInterface<int> intInterface = new MyImplementation();
        IMyInterface<object> objInterface = intInterface; // 逆变
    }

    static void ItemHandler(int item)
    {
        Console.WriteLine(item);
    }

    class MyImplementation : IMyInterface<int>
    {
        public void Add(int item)
        {
            Console.WriteLine(item);
        }
    }
}

在这个例子中,MyDelegateIMyInterface 都使用了逆变类型参数 in T。这意味着 MyDelegate<int> 可以被赋值给 MyDelegate<object>,并且 IMyInterface<int> 可以被赋值给 IMyInterface<object>

in 关键字

in 关键字用于在方法参数中声明只读引用。它确保方法内部不能修改传递进来的变量的值。这与逆变的概念是不同的,尽管两者都使用了 in 关键字。

in 关键字与逆变的关系

虽然 in 关键字在泛型参数中用于实现逆变,但在方法参数中使用 in 关键字则是为了声明只读引用。这两种用途虽然都使用了 in 关键字,但它们的目的和应用场景是不同的。

  • 逆变

    • 用于泛型类型参数,使一个类型参数可以接受其父类型的实例。
    • 通常用于委托、接口或泛型方法的参数类型。
  • in 关键字(只读引用)

    • 用于方法参数,确保方法内部不能修改传递进来的变量的值。
    • 用于提高性能和防止意外修改。

总结

虽然 in 关键字在泛型参数中用于实现逆变,但在方法参数中使用 in 关键字则是为了声明只读引用。这两种用途虽然都使用了 in 关键字,但它们的目的和应用场景是不同的。逆变主要用于泛型类型参数,而 in 关键字在方法参数中的使用是为了确保方法内部不能修改外部变量的值。

标签:关系,关键字,逆变,泛型,类型,参数,IMyInterface
From: https://www.cnblogs.com/voyager-rz/p/18331158

相关文章

  • 测试需求、测试用例、bug的关系
    测试需求和测试用例、缺陷报告的关系?测试的基本流程:获取测试需求--编写测试计划--制定测试方案--设计和开发测试用例--执行测试--提交缺陷--测试分析和评审--测试总结--准备下一版本的测试获取测试需求是测试工作的重点,也是第一步。通过需求的分析,了解和掌握测试的方向和内容。......
  • sqlalchemy - 关系上的“验证”不会在分配事件上发出
    考虑以下使用sqlalchemy:fromsqlalchemy.ormimportvalidatesclassDeviceTestResult:__tablename__="device_test"passed:bool=mapped_column(default=False,init=False)failure_modes:Mapped[list['FailureMode']]=......
  • Neo4j:如何将参数传递给关系?
    neo4j官网指出,我们不能向关系类型传递参数。但是,我在批量添加嵌入时需要向关系传递参数。Neo4j通过driver.execute_query('''UNWIND$moviesasmovieMATCH(m:Movie{title:movie.title,plot:movie.plot})CALLdb.create.setNodeVectorPrope......
  • 【MathType】彻底解决公式大小与文章文字大小不统一(含字体的字号与磅(pt)和像素(px)之间
    在使用Mathtype的时候,有时候会出现公式大小不统一的情况,这时候手动去拖动大小的话非常不理想,并且使用格式化公式也没有效果。下面来具体分析一下导致的原因、字体的字号与磅(pt)和像素(px)之间的关系、彻底解决方法。下面图片是一个小示例(请忽略具体内容)1.大小不一致原因查看Mat......
  • 【SQL 新手教程 3/20】关系模型 -- 外键
    ......
  • 广域网(WAN)、局域网(LAN)的区别与联系、WLAN与WiFi的关系,ipconfig和ping
    1.广域网和局域网广域网(WideAreaNetwork),简称WAN,是一种地域范围覆盖广的计算机网络的集合,通常所覆盖的范围从几十公里到几千公里,它能连接多个地区、城市和国家。由于其超长的覆盖范围,发送介质主要是政府或者大型企业部署的电话线或光纤,因此又被大家亲切的称为:外网、公网。......
  • tortoise.exceptions.OperationalError:运行测试时关系不存在
    我正在学习TDDfastapi、docker和pytest课程的第一部分。我遇到了一个奇怪的问题,需要您的帮助。当我创建第一个使用torotoise的测试时,它工作正常,将记录添加到数据库,并从fastapi获取它,没有任何问题。分钟我添加另一个测试(添加的测试,然后读取记录),我收到此错误:tor......
  • 01-从WordCount程序理解Spark术语及术语间的关系
    1.应用程序(Application)通过下面的代码设置应用程序名称,设置后再UI中可以看到相应的名称。//1.设置Application的名称valconf=newSparkConf()conf.setAppName("WordCount")conf.setMaster("local")2.作业(Job)Job由scala的执行算子生成,每个执行的算子会调起runjob,从而......
  • NIO三大组件关系
    JavaNIO同步非阻塞模式,通过Selector选择器使一个线程从某通道(Channel已就绪准备好数据载体),让线程不会因为阻塞没事可做通俗理解:NIO是可以做到用一个线程来处理多个操作的.假设有10000个请求过来,根据实际情况,可以分配50或者100个线程来处理.不像之前的阻塞IO那样,非......
  • SQL数据库表 多对多关系设计--省去链表的尝试
     概述 之前遇到一个MES需求,需要创建一个基础资料表"人员信息表",用于其它业务的人员信息关连,因为这些人员并非系统登录帐号,所以单独进行维护。人员表涉及到字段包括:ID,工号,姓名,所属工序,所属职称,所属车间。其中,所属工序、所属职称、所属车间为多选。例:一位人员,比如"班长......