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

为什么接口IOrderedEnumerable<T>在T中不是协变的?

接口IOrderedEnumerable<T>在T中不是协变的,是因为协变性要求泛型参数只能用于方法的返回类型,而不能用于方法的参数类型。而IOrderedEnumerable<T>接口中的方法OrderBy和ThenBy接受的参数类型是Func<T, TKey>,其中TKey是用于排序的键类型。如果T是协变的,那么就可以将IOrderedEnumerable<T>赋值给IOrderedEnumerable<object>,然后将Func<T, TKey>赋值给Func<object, TKey>,这样就可以传入不同类型的参数进行排序,这是不安全的。

协变性和逆变性是C# 4.0引入的泛型变体的概念。协变性允许将一个泛型类型参数声明为一个接口或委托的返回类型,并且可以将派生类型的实例赋值给基类型的变量。逆变性则允许将一个泛型类型参数声明为一个接口或委托的参数类型,并且可以将基类型的实例赋值给派生类型的变量。

然而,协变性和逆变性只适用于引用类型,而不适用于值类型。因为值类型在内存中的布局是固定的,无法进行类型转换。所以对于值类型,无论是作为参数类型还是返回类型,都不能使用协变性或逆变性。

在IOrderedEnumerable<T>接口中,T是一个泛型类型参数,可以是引用类型也可以是值类型。因此,为了保证类型安全,T不能是协变的,即不能用于方法的参数类型。这样可以避免在排序过程中出现类型不匹配的错误。

总结起来,接口IOrderedEnumerable<T>在T中不是协变的,是为了保证类型安全,避免在排序过程中出现类型不匹配的错误。

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

相关·内容

为什么CD4阳性T细胞并不是表达CD4最多

, "CD14+ Mono", "Memory CD4 T", "B", "CD8 T", "FCGR3A+ Mono", "NK", "DC", "Platelet...CD4基因表达量时候,发现了很有意思现象: 各个细胞亚群,都是有CD4基因表达 可以看到各个细胞亚群,都是有CD4基因表达,我们虽然命名了 Naive CD4 T和Memory CD4 T"...其实上面的图就是umap上面叠加FeaturePlot信息,我给出来代码如下所示: p2=DimPlot(sce, reduction = "umap", label = TRUE...✦ 数据(Data),最基础是可视化数据和一系列图形映射(aesthetic mappings),该映射描述了数据变量如何映射到可见图形属性。...✦ 几何对象(Geometric objects, geoms)代表图中实际看到点、线、多边形等。

78010

C#4.0新增功能03 泛型和逆

Invariance 这意味着,你只能使用原始指定类型;固定泛型类型参数既不是类型,也不是类型。...对于接口类型参数可用作接口方法返回类型,而逆类型参数可用作接口方法参数类型。 和逆统称为“变体” 。 未标记为或逆泛型类型参数称为“固定参数” 。...类型参数用 out 关键字( Visual Basic 为Out 关键字, + MSIL 汇编程序 为)标记。 可以将类型参数用作属于接口方法返回值,或用作委托返回类型。...Visual Basic 和 C# 不允许违反和逆类型参数使用规则,也不允许将和逆批注添加到接口和委托类型之外类型参数。...Variant 泛型接口和委托类型列表 .NET Framework 4 ,下面的接口和委托类型具有和/或逆类型参数。

1.3K20

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

因为只能用在接口或者委托类型,所以我们将AnimalHouse抽象抽来一个空接口IAnimalHouse,然后实现该接口: //动物房子接口(所有动物房子必须继承该接口,例如红砖动物房子,别墅动物房...逆: ? : ? 语法都是一些 非常粗糙东西,重要是思想、思想、思想。然后我们来看一下为什么要有逆和协? 什么叫做类型安全?...void AddAnimal(T a); //移除方法 bool RemoveAnimal(T a); } 然后我们主类(Main函数所在类)添加一个TestIn方法来说明为什么是安全...所以当逆变作为参数传递时,类型是安全。 思考:那么,现在你能明白上面那个错误,为什么时泛型无法作为参数、逆时泛型无法作为返回值”了吗?...(T a); bool RemoveAnimal(T a); } //主类(Main类)添加一个out测试方法 public static IAnimalHouse TestOut

6.7K30

编写高质量代码改善C#程序157个建议

本文主要学习记录以下内容:   建议42、使用泛型参数兼容泛型接口不可变性   建议43、让接口泛型参数支持   建议44、理解委托   建议45、为泛型类型参数指定 建议42、...不是一种新出现技术,以往编码,我们已经不自觉地使用。...实际上,只要泛型类型参数一个接口声明不被用来作为方法输入参数,我们都可姑且把它堪称是“返回值”类型。所以,本建议这种模式是满足“定义。...我们自己代码,如果要编写泛型接口,除非确定该接口泛型参数不涉及变体,否则都建议加上out关键字。增大了接口使用范围,而且几乎不会带来什么副作用。...建议44、理解委托 委托泛型变量天然是部分支持为什么说是“部分支持”呢?

31330

C#泛型之个人理解

我有个朋友, 使用过程中发现一个问题 IFace item = new Face(); // CS0266 public interface IFace {...object> list = new List(); 这个为什么就可以 A:   这就要讲到C#泛型里变了 Q:   细嗦细嗦 逆 C#泛型(in)(out)对于不常自定义泛型开发来说...A:   简单来说, 有关泛型输入用逆, 关键词是in, 有关泛型输出, 关键词是out, 如果接口中既有输入又有输出, 就不能用逆 Q:   为什么这两个不能同时存在?..., 是将子类转为基类, 这个时候你也可以说基类是子类; 如果同时支持逆, 若先进行子类赋值给基类操作, 此时输出是基类, 子类转为基类并不会有什么问题, 但进行输入操作时就是将基类转为子类,...A:   假设 IEnumerable 同时支持逆, IEnumerable list = new List();进行赋值后, list实际保存类型是string

17020

C#和逆

变成Animal 就是和谐变化(),而如果Animal 变成Dog就是不正常变化(逆) Main函数输入: 因为Dog继承自Animal,所以Animal aAnimal = aDog;...正因如此,所以微软新增了两个关键字:Out,In,下面是他们msdn解释: 英文是:“covariant”,逆英文是:“Contravariant” 为什么Microsoft选择是”Out...我个人理解: 因为和逆英文太复杂了,并没有体现和逆不同,但是out 和 in 却很直白。...想要回答这个问题需要在回头看看Clr via C# 关于泛型和接口章节了,我就不解释了,  答案是不可以。  上面演示,接下来要演示下逆。 ...为了演示逆,那么就要找个in标记接口或者委托了,最简单就是:  Main函数添加:  Action actionAnimal = new Action(a =>

92730

C# 4.0新特性-与逆以及背后编程思想

《上篇》我们揭示了“缺省参数”本质,现在我们接着来谈谈C#4.0另一个重要新特性:(Covariance)与逆(Contravariance)。...目录 一、两个概念:强类型与弱类型 二、委托与逆使用 三、接口与逆使用 四、从Func...二、委托与逆使用 和逆主要体现在两个地方:接口和委托,先来看看在委托如何使用和逆。...接下来我们同样通过一个简单例子来说明接口中如何使用和逆。...然后,你再想想为什么用in关键字,而用out关键字。这两个不是偶然,实际上我们可以将/逆与输出/输入匹配起来。 我们再从另一个角度来理解与逆

60980

深入理解java泛型

泛型和协 有关协和逆详细说明可以参考: 深入理解和逆 这里我再总结一下,和逆只有类型声明类型参数里才有意义,对参数化方法没有意义,因为该标记影响是子类继承行为,而方法没有子类...当然java没有显示表示参数类型是还是逆意思是如果有两个类 A 和 A, 其中C是T子类,那么我们可以用A来替代A。 逆就是相反关系。...Java数组就是,比如Integer是Number子类,那么Integer[]也是 Number[]子类,我们可以需要 Number[] 时候传入 Integer[]。...接下来我们考虑泛型情况,List 是不是 List父类呢?很遗憾,并不是。 我们得出这样一个结论:泛型不是为什么呢?...类型擦除要注意事项 因为类型擦除原因,我们接口实现,实现同一个接口两个不同类型是无意义: public class someClass implements Comparable<Number

40510

泛型泛型知多少

和逆只有类型声明类型参数里才有意义,对参数化方法没有意义,因为该标记影响是子类继承行为,而方法没有子类。...当然java没有显示表示参数类型是还是逆意思是如果有两个类 A 和 A, 其中C是T子类,那么我们可以用A来替代A。 逆就是相反关系。...Java数组就是,比如Integer是Number子类,那么Integer[]也是 Number[]子类,我们可以需要 Number[] 时候传入 Integer[]。...接下来我们考虑泛型情况,List 是不是 List父类呢?很遗憾,并不是。 我们得出这样一个结论:泛型不是为什么呢?...类型擦除要注意事项 因为类型擦除原因,我们接口实现,实现同一个接口两个不同类型是无意义: public class someClass implements Comparable<Number

1.1K10

一文了解 JavaKotlin 泛型

阅读本文你将了解:什么是型、逆和不型变在 Java 和 Kotlin 如何实现以上型Java 和 Kotlin 泛型异同在 Java/Kotlin ,子类对象是可以赋值给一个父类类型...> 和 List 不具备任何继关系,也不可以相互赋值、逆变本来是数学概念, Java/Kotlin 主要应用在泛型。...:声明处型泛型类声明时候定义型使用处型使用泛型类时候定义型// 声明处型: 声明类时候,就指定了类型参数为 out T, 此时泛型是interface SourceA) {} Java 只能在使用处发生型,因此 Java 没有声明处型思考...String is T 会判断为 false, 同时这也是为什么我们不能写成 T is String 因为 T 不是一个对象图片

87620

一文了解 JavaKotlin 泛型

阅读本文你将了解:什么是型、逆和不型变在 Java 和 Kotlin 如何实现以上型Java 和 Kotlin 泛型异同在 Java/Kotlin ,子类对象是可以赋值给一个父类类型...> 和 List 不具备任何继关系,也不可以相互赋值、逆变本来是数学概念, Java/Kotlin 主要应用在泛型。...:声明处型泛型类声明时候定义型使用处型使用泛型类时候定义型// 声明处型: 声明类时候,就指定了类型参数为 out T, 此时泛型是interface SourceA) {} Java 只能在使用处发生型,因此 Java 没有声明处型思考...String is T 会判断为 false, 同时这也是为什么我们不能写成 T is String 因为 T 不是一个对象图片

1.1K52

【c#】泛型

为什么不能使用object替代泛型 a.性能问题——装箱拆箱 b.类型安全问题 二、泛型声明——设计思想 1.泛型方法:一个方法名称后面多了一个尖括号,尖括号中有占位符 2.延迟声明...五、泛型约束 object类型安全问题:向接收object类型方法传递类,接收object类型方法可能会有对类转换,但是接口没有约束,会导致隐患。...) where T : Enum { } 7.限定泛型继承关系约束 /// /// 限定泛型继承关系 /// 要不是同一类型要不是继承关系 /// T继承S /// </summary...和逆只支持泛型接口和泛型委托 可以让右边使用子类,左边使用父类。...in类型参数只能做参数,不能作为返回值 存在就是为了满足常规场景添加一个避开风险约束 不安全场景事例: 以这样一个接口举例 public interface ICustomerListOut

7110

Flowportal.Net 3.5t BPM批量设定输入框、下拉选项字体颜色

对于input和textarea,BPM里有一个DisableBehavior属性如下图,默认是Disable,修改为Readonly就能解决。...首先想起来就是用Jquery,把核心代码写到 $(document).ready(function(){},可悲是,调整input控件代码执行了,但是去掉select控件属性代码怎么都不执行。...,他说BPM本身js是documentReady状态执行,可能跟JquerydocumentReady会有先后执行顺序问题。...给出建议使用Button来调试那段去掉select控件属性代码,如果成功的话,就放到body.onload调用。 于是拖了一个xButton控件到页面任意地方,然后用如下代码调试,一切顺利。...disabled");$("select").removeAttr("readonly");}); 于是按照马丁所给思路,我把代码写到window.onload

1.5K30

Kotlin基础之泛型

首先,Java泛型为不可变类型,意味List不是List子类型。为什么这样?如果List为可变量,List不会比Java数组更好,并且下面的代码能够成功编译,但在运行时会引起异常。...称类C是参数T变量,或T变量类型参数。可以认为类C是T生产者,而不是T消费者。 out修饰符称为变型注解,因为它提供了类型参数声明点,因此称之为声明点类型。...fun set(index: Int , value: T){/*...*/} } Array类既不是T,也不是T,导致不够灵活。...意味着T类型未知时,可以安全地读取FooTUpper值 对于Foo,T为逆类型参数,Foo等价于Foo,意味着当T类型未知时,无法安全写入Foo 对于Foo,T为不可变类型参数,带有上界...T : Cloneable { return list.filter{it -> threshold }.map { it.clone()} } 附:里氏替换原则与逆泛型和逆

94470

了解C#和逆

Invariance 表示只能使用最初指定类型。 固定泛型类型参数既不是,也不是。 你无法将 List 实例分配给 List 类型变量,反之亦然。...,C#和逆就是主要有两种目的: 兼容性:.NET2.0就推出了泛型,而从.NET 2.0到.NET 3.5期间不支持对泛型接口占位符T支持隐式转换,因此.NET4.0推出和逆 为了支持更广泛隐式类型转换...,在这里就是泛型体系中支持 C#,目前只有泛型接口和泛型委托可以支持和逆(Covariance) 内置泛型接口,IEnumerator、IQuerable、IGrouping...、方法或者委托输入参数 当要进行类型转换,占位符T要转换目标类型也必须是其子类,上述例子则是FooBase转为Foo 总结 和逆只对泛型委托和泛型接口有效,对普通泛型类和泛型方法无效 和逆类型必须是引用类型...,因为值类型不具备继承性,因此类型转换存在不兼容性 泛型接口和泛型委托可同时存在和逆类型参数,即占位符T 参考 泛型和逆 | Microsoft Docs 《你必须知道.NET(第2

90510

Kotlin泛型之路

❞ 泛型类型Java,通常以一个大写字母来进行标识,我们并不是一定要写「T」来表示泛型,但这是一个约定成俗表示,类似的约束还有下面这些。...open class A class B : A() 那么Test和Test是不是一个类型呢?必须不是,虽然A和B是父子关系,但Test和Test就不是了,为什么呢?...所以,Java,每次获取数据时候,都要声明一次,所以Kotlin对其进行了优化,可以申明处进行,代码如下。...支持List Kotlin,有两种List,一种是可变,一种是不可变,即MutableList和List,其中List申明如下,它已经实现,所以KotlinList只能读而不能写...那么我们实际代码,要在哪些场景使用和逆呢?通常来说,泛型参数后则表示——「这个参数在当前类,只能作为函数返回值,或者是只读属性」。

1.2K21
领券