首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么IEquatable T在T#4.0中没有逆变?

在T#4.0中,IEquatable<T>没有逆变的原因是因为逆变是针对接口的泛型参数而言的,而IEquatable<T>是一个具体的接口,它的泛型参数T表示要比较的对象的类型。逆变是指在泛型类型参数上可以接受基类型的实例,而IEquatable<T>的泛型参数T表示要比较的对象的类型,它没有基类型,因此无法进行逆变。

IEquatable<T>是用于比较两个对象是否相等的接口,它定义了一个Equals方法,用于比较当前对象和指定的对象是否相等。在T#4.0中,IEquatable<T>没有逆变,意味着在使用IEquatable<T>接口时,需要确保比较的对象类型与泛型参数T完全匹配。

IEquatable<T>的优势在于可以提供更高效的对象比较,因为它避免了装箱和拆箱的开销。适用场景包括需要频繁进行对象比较的情况,例如集合的查找、排序等操作。

对于腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,无法给出相关链接。但腾讯云作为一家知名的云计算服务提供商,提供了丰富的云计算产品和解决方案,可以根据具体需求在腾讯云官方网站上查找相关产品和文档。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

了解C#的协

前言 引用类型系统时,协和不变性具有如下定义。 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类。...: 兼容性:.NET2.0就推出了泛型,而从.NET 2.0到.NET 3.5期间不支持对泛型接口中的占位符T支持隐式转换,因此.NET4.0推出协 为了支持更广泛的隐式类型的转换,在这里就是泛型体系中支持...C#,目前只有泛型接口和泛型委托可以支持协, 协(Covariance) 内置的泛型协接口,IEnumerator、IQuerable、IGrouping<Tkey, TElement...,上述例子则是Foo隐式转为FooBase (Contravariance) 内置的泛型委托Action、Func 、Predicate,内置的泛型接口IComparable、IEquatable...,因为值类型不具备继承性,因此类型转换存在不兼容性 泛型接口和泛型委托可同时存在协的类型参数,即占位符T 参考 泛型的协 | Microsoft Docs 《你必须知道的.NET(第2

88410

【DB笔试面试565】Oracle为什么索引没有被使用?

♣ 题目部分 Oracle为什么索引没有被使用? ♣ 答案部分 “为什么索引没有被使用”是一个涉及面较广的问题。有多种原因会导致索引不能被使用。...还有很多其它原因会导致不能使用索引,这个问题在MOS(MOS即My Oracle Support)“文档1549181.1为何在查询索引未被使用”中有非常详细的解释,作者已经将相关内容发布到BLOG(...二、索引本身的问题 n 索引的索引列是否WHERE条件(Predicate List)? n 索引列是否用在连接谓词(Join Predicates)?...n 总体成本,表扫描的成本是否占大部分? n 访问空索引并不意味着比访问有值的索引高效? n 参数设置是否正确? 四、其它问题 n 是否存在远程表(Remote Table)?...n 是否WHERE子句中对索引列进行了IS NULL值判断? n 是否查询转换失败导致不能选择索引? n 是否使用了视图或子查询? ? 详细情况如下表所示: ?

1.1K20

为什么Java没有为空字符串设置访问API呢 | Java Debug 笔记

为什么Java没有为空字符串设置访问API呢?...=========================熟悉Java的朋友都知道,当我们通过双引号创建字符串的时候,Java 会将字符串存储常量池中以供我们下次使用但是为什么String类不为我们提供一个对空字符串的引用呢因为这样做至少可以节省了编译的时间...我个人认为这某种意义上来说这有点“代码味道”所以说,关于String的空字符一说Java是否有更加复杂的涉及考虑还说设计者没有考虑到这个问题呢回答1===String.EMPTY是12个字符,而"..."仅仅2个字符,它们在运行时都将引用内存完全相同的实例。...我不太确定为什么是String.EMPTY可以节省编译时间,实际上我认为应该是后者考虑到String被final修饰是不可变得。

11810

自定义值类型一定不要忘了重写Equals,否则性能和空间双双堪忧

讲故事 曾今项目中发现有同事自定义结构体的时候,居然没有重写Equals方法,比如下面这段代码: static void Main(string[] args) { var...寻找ValueType的Equals实现 为什么会这样呢?...遇到问题 很多时候我们会定义各种泛型类,泛型操作通常会涉及到T之间的 equals, 比如下面我设计的一段代码,为了方便,我把Point的默认Equals也重写一下。...从输出结果看,还是走了通用的equals方法,这就尴尬了,为什么会这样呢? 2. 从FCL的值类型实现上寻找问题 有时候苦思冥想找不出问题,突然灵光一现,FCL不也有一些自定义值类型吗?...补上 IEquatable 接口 有了这个思路,我也跟FCL学,让Point实现 IEquatable接口,然后TProxy代理类约束下必须实现IEquatable,修改代码如下:

31220

C#泛型的之个人理解

A:   这就要讲到C#泛型里的协变了 Q:   细嗦细嗦 C#泛型(in)协(out)对于不常自定义泛型的开发来说(可能)是个很难理解的概念, 简单来说其表现形式如下 (...A:   简单来说, 有关泛型输入的用, 关键词是in, 有关泛型输出的用协, 关键词是out, 如果接口中既有输入又有输出, 就不能用 Q:   为什么这两个不能同时存在?..., 是将子类转为基类, 这个时候你也可以说基类是子类; 如果同时支持, 若先进行子类赋值给基类的操作, 此时输出的是基类, 子类转为基类并不会有什么问题, 但进行输入操作时就是将基类转为子类,...A:   假设 IEnumerable 同时支持, IEnumerable list = new List();进行赋值后, list实际保存的类型是string..., item.First()的输出类型为object, 实际类型是string, 此时说string是object没有任何问题, 协可以正常发挥作用; 但是如果支持了, 假设我们进行输入类型的操作

15720

Java泛型的协

背景 文接上回,说到过Java的泛型擦除问题,这块我又联想到一个有意思的考点泛型的协。...相信大家也都见到过JDK很多源码也有这么用,但为什么要这么写呢? 根因是Java的泛型没有类型,无法关联起来,也就没有关系。 利用通配符,?代表子类,T为父类。...二、 ,超类型限定。 同样也是各类源码中层出不穷,结合协的理解,这块相信大家应该不难理解。 常见的例子比如,List<?...理解它,也可以通过Java的继承关系, 假设存在继承关系Object-》TT-》A、T-》B; 即T为A、B的父类,协面向子类;面向Object,它是所有对象的父类。...小结 1、协的区别要分清 2、另外,再提一点泛型和通配符的区别,当然也可以结合第一点理解, 用于定义泛型类和方法,擦除后为AAA类型; <?

62500

Java泛型的协

背景 文接上回,说到过Java的泛型擦除问题,这块我又联想到一个有意思的考点泛型的协。...相信大家也都见到过JDK很多源码也有这么用,但为什么要这么写呢? 根因是Java的泛型没有类型,无法关联起来,也就没有关系。 利用通配符,?代表子类,T为父类。...二、 ,超类型限定。 同样也是各类源码中层出不穷,结合协的理解,这块相信大家应该不难理解。 常见的例子比如,List<?...理解它,也可以通过Java的继承关系, 假设存在继承关系Object-》TT-》A、T-》B; 即T为A、B的父类,协面向子类;面向Object,它是所有对象的父类。...小结 1、协的区别要分清。 2、另外,再提一点泛型和通配符的区别,当然也可以结合第一点理解, 用于定义泛型类和方法,擦除后为AAA类型; <?

49050

与不变

而 Scala 做了正确的事, Scala ,数组的声明和别的类没有什么不同: final class Array[T] extends java.io.Serializable with java.lang.Cloneable... Scala 类型参数前添加 + 代表参数化类型该类型参数上协,添加 - 则代表,什么都不加就是不变。...很难想象什么地方会出现的情况,而事实上,函数类型相对于其参数类型就是的,Scala 接受一个参数的函数类型声明如下: trait Function1[-T1, +R] extends AnyRef... Java ,类似于协也是应用的时候才去对其进行约束,例如: List persons = new ArrayList(); List<?... Scala ,如果进行了协或者的标记,编译器就会对这个类型参数的使用进行检查,如果它出现在了错误的位置上,编译器就会提示错误,防止了开发者因此而犯错。

1.7K30

C#高级语法之泛型、泛型约束,类型安全、和协(思想原理)

泛型其实就是一个不确定的类型,可以用在类和方法上,泛型声明期间没有明确的定义类型,编译完成之后会生成一个占位符,只有调用者调用时,传入指定的类型,才会用确切的类型将占位符替换掉。...: ? 协: ? 语法都是一些 非常粗糙的东西,重要的是思想、思想、思想。然后我们来看一下为什么要有和协? 什么叫做类型安全?...void AddAnimal(T a); //移除方法 bool RemoveAnimal(T a); } 然后我们主类(Main函数所在的类)添加一个TestIn方法来说明为什么是安全的...思考:那么,现在你能明白上面那个错误,为什么“协时泛型无法作为参数、时泛型无法作为返回值”了吗?...(T a); bool RemoveAnimal(T a); } //主类(Main类)添加一个out协测试方法 public static IAnimalHouse TestOut

6.5K30

C#协

直白的理解:  “协”->”和谐的”->”很自然的变化”->string->object :协。  “”->”常的”->”不正常的变化”->object->string 。 ...Animal 变成Dog就是不正常的变化() Main函数输入: 因为Dog继承自Animal,所以Animal aAnimal = aDog; aDog 会隐式的转变为Animal....正因如此,所以微软新增了两个关键字:Out,In,下面是他们的msdn解释: 协的英文是:“covariant”,的英文是:“Contravariant” 为什么Microsoft选择的是”Out...我个人的理解: 因为协的英文太复杂了,并没有体现协的不同,但是out 和 in 却很直白。...为了演示,那么就要找个in标记的接口或者委托了,最简单的就是:  Main函数添加:  Action actionAnimal = new Action(a =>

92030

深入理解java的泛型

编译器在编译的过程执行类型检查来保证类型安全,但是随后的字节码生成之前将其擦除。 这样就会带来让人困惑的结果。本文将会详细讲解泛型java的使用,以避免进入误区。...泛型和协 有关协的详细说明可以参考: 深入理解协 这里我再总结一下,协只有类型声明的类型参数里才有意义,对参数化的方法没有意义,因为该标记影响的是子类继承行为,而方法没有子类...当然java没有显示的表示参数类型是协还是。 协意思是如果有两个类 A 和 A, 其中C是T的子类,那么我们可以用A来替代A。 就是相反的关系。...我们得出这样一个结论:泛型不是协的。 为什么呢?...刚刚我们讲到Array是协的,如果在Array带入泛型,则会发生编译错误。比如new List[10]是不合法的,但是 new List[10]是可以的。因为泛型?

38610

泛型泛型知多少

泛型和协 有关协的详细说明可以参考:我之前的一篇文章:深入理解协 http://www.flydean.com/scala-covariance-contravariant/ 这里我再总结一下...,协只有类型声明的类型参数里才有意义,对参数化的方法没有意义,因为该标记影响的是子类继承行为,而方法没有子类。...当然java没有显示的表示参数类型是协还是。 协意思是如果有两个类 A 和 A, 其中C是T的子类,那么我们可以用A来替代A。 就是相反的关系。...我们得出这样一个结论:泛型不是协的。 为什么呢?...刚刚我们讲到Array是协的,如果在Array带入泛型,则会发生编译错误。比如new List[10]是不合法的,但是 new List[10]是可以的。因为泛型?

1K10

C# - 为引用类型重定义相等性

之前重写值类型相等性的文章里,我还为值类型实现了IEquatable接口,而对于引用类型来说,就没有必要去实现该接口了,可以把相等性判断逻辑放在object.Equals()方法里。...但是为什么原来的写法就没有问题呢? ? 原来的写法里,Citizen这个父类里,==的实现调用了 object的静态Equals()方法,而在这个静态Equals方法里: ?...为什么不实现IEquatable 如果我Citizen类里面实现了该接口: ? 那么方法里的调用也还是调用virtual的Equals(),否则的话还是一样的bug。...所以针对引用类型,不建议实现IEquatable接口。 非得实现的话建议sealed 例如: ?...综上个人建议是针对引用类型不去实现IEquatable接口。

70220

一文了解 JavaKotlin 的泛型

阅读本文你将了解:什么是型、协和不型变在 Java 和 Kotlin 如何实现以上型Java 和 Kotlin 泛型的异同在 Java/Kotlin ,子类对象是可以赋值给一个父类类型的...> 和 List 不具备任何继关系,也不可以相互赋值协变本来是数学的概念, Java/Kotlin 主要应用在泛型。...T> {}// 声明的时候没有指定型,此时该泛型类型的不型的interface SourceB {}// 使用处型: 使用 SourceB 作为参数的时候,我们指定了类型参数为 out...String, 让 SourceB 发生了协fun useSource(source: SourceB) {} Java 只能在使用处发生型,因此 Java 没有声明处型思考...: Kotlin 为什么要搞出声明处型呢?

85720

一文了解 JavaKotlin 的泛型

阅读本文你将了解:什么是型、协和不型变在 Java 和 Kotlin 如何实现以上型Java 和 Kotlin 泛型的异同在 Java/Kotlin ,子类对象是可以赋值给一个父类类型的...> 和 List 不具备任何继关系,也不可以相互赋值协变本来是数学的概念, Java/Kotlin 主要应用在泛型。...T> {}// 声明的时候没有指定型,此时该泛型类型的不型的interface SourceB {}// 使用处型: 使用 SourceB 作为参数的时候,我们指定了类型参数为 out...String, 让 SourceB 发生了协fun useSource(source: SourceB) {} Java 只能在使用处发生型,因此 Java 没有声明处型思考...: Kotlin 为什么要搞出声明处型呢?

1.1K52

深入 TypeScript 的子类型、、协,进阶 Vue3 源码前必须搞懂的。

,或者写一些复杂类型的时候看到别人可以这么写,但是不知道为什么他可以生效。...当我初学的时候,我会觉得 T extends {} 这样的语句很奇怪,为什么可以 extends 一个空类型并且传递任意类型时都成立呢?当搞明白上面的知识点,这个问题也自然迎刃而解了。...和协 先来段维基百科的定义: 协(covariance and contravariance)是计算机科学,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父... TS 当然, TypeScript ,由于灵活性等权衡,对于函数参数默认的处理是 双向协 的。...开启了 tsconfig 的 strictFunctionType 后才会严格按照 来约束赋值关系。

1.2K31

面试官问我:“泛型擦除是什么,会带来什么问题?”

如果我们一个List不知情的情况下插入了一个String类型的数值,那这种重大错误,我们该找谁去说呢。...从百度上只要这样输入关键词,java 与协 你就能得到类似与下方文字的统一解。 与协描述的是类型转换后的继承关系。...其实转化一下问题就是为什么要引入与协这两个机制呢? 先来想一下,泛型在运行时有什么问题? 很显然,泛型擦除嘛!! 那泛型擦除的具体表现是什么?...关于插入操作,为什么要用 通过引入协的机制,List<?...反证法来证明一下,Sun公司的工程师总比我资深吧,那这个玩意儿总该是对的,而且你在案例也确实能看出是从src获取数据,然后des存储对比,那说明一个问题,是不是应该把这个公式改成PSCE呢?

2.1K41
领券