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

相关时,如何在两个之间创建类似子类型关系呢

比如可以将一个Integer类型对象分配给Object类型对象,因为Object 是Integer。...那么问题来了,相关时,如何在两个之间创建类似子类型关系呢?例如如何让Box 和Box变得与Box有关呢?...小结:可以通过继承或者实现接口来对其进行子类型化。 搞懂了子类型化问题,我们回到“如何在两个之间创建类似子类型关系“问题。...或者接口并不会仅仅因为它们类型之间有关系而变得相关,如果要达到相关,我们可以使用通配符来创建或接口之间关系。...> 为了在这些之间创建关系,以便代码可以通过Box访问Box方法,可以使用上限通配符: Box<?

2.8K20
您找到你想要的搜索结果了吗?
是的
没有找到

C#用处

这个是以前存在手机里面的技术性文章,看过了一次,现在再拿出来看应该可以加深印象,同时还可以获得意想不到效果吧~~~ .NET在一起来最让我“害怕”,感觉它语法很没有“规律”,怪就怪我对它机制不太了解...使用 下面是用来重写上面的栈,用一个通用数据类型T来作为一个占位符,等待在实例化时用一个实际类型来代替。...C#几个特点 如果实例化类型参数相同,那么JIT编译器会重复使用该类型,因此C#动态能力避免了C++静态模板可能导致代码膨胀问题。...C#采用“基、接口、构造器、值类型/引用类型”约束方式来实现对类型参数“显示约束”,提高了类型安全同时,也丧失了C++模板基于“签名”隐式约束所具有的高灵活性。...按照这个原理,我们可以这样认为:不同封闭是分别不同数据类型。 这样不仅更加灵活,也同时将代码简便和提高到一个层次!不用再为具体不同重载方法写具体代码了!

1.2K10

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

前言   并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现新功能。基于,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了方法中转型,确保了类型安全。...但是这两个类型属性和方法都是非常接近,如果有一种方法可以让类型接收一个通用数据类型,这样就可以进行代码复用了,同时类型也只要一个就够了。完成就是这样功能。...,在C#编译生成IL代码中,T就是一个占位符角色。...我们可以把MyList和MyList视作两个完全不同类型,但是,这仅是对本地代码而言,对于实际C#代码,它仅仅拥有一个类型,那就是类型MyList。   ...建议33、避免在类型中声明静态成员  在上一个建议中,已经解释了应该将MyList 和MyList 视作两个完全不同类型,所以,不应将MyList中静态成员理解成为

59620

C#逆变协变之个人理解

一般来说, 作用就类似一个占位符, 或者说是一个参数, 可以让我们把类型像参数一样进行传递, 尽可能地复用代码。...object> list = new List(); 这个为什么就可以 A:   这就要讲到C#逆变协变了 Q:   细嗦细嗦 逆变协变 C#逆变(in)协变(out)对于不常自定义开发来说...A:   简单来说, 有关输入用逆变, 关键词是in, 有关输出用协变, 关键词是out, 如果接口中既有输入又有输出, 就不能用逆变协变 Q:   为什么这两个不能同时存在?...A:   协变表现形式为将子类赋值, 进行输出相关操作时, 输出对象类型为基, 是将子类转为基, 你可以说子类是基; 逆变表现形式为将基赋值子类, 进行输入相关操作时, 输入对象为子类..., 是将子类转为基, 这个时候你也可以说基是子类; 如果同时支持逆变协变, 若先进行子类赋值操作, 此时输出是基, 子类转为基并不会有什么问题, 但进行输入操作时就是在将基转为子类,

16520

C#

C# 2008-12-17 作者: 张子阳 分类: C# 语言 .Net 1.1版本最受诟病一个缺陷就是没有提供对支持。...通过使用,我们可以极大地提高代码重用度,同时还可以获得强类型支持,避免了隐式装箱、拆箱,在一定程度上提升了应用程序性能。本文将系统地为大家讨论,我们先从理解开始。...这是一个最典型应用,可以看到,通过使用,我们极大地减少了重复代码,使我们程序更加清爽,就类似于一个模板,可以在需要时为这个模板传入任何我们需要类型。...Book类型数组,然后试着使用上一小节定义来对它进行排序,我想代码应该是这样子: Book[] bookArray = new Book[2]; Book book1 = new Book...好了,我们现在回到正题,既然我们现在已经让Book实现了IComparable接口,那么我们应该可以工作了吧?

1.1K70

在C++中反射调用.NET(三) 使用集合委托方法C++中列表对象list C++传递集合数据.NET创建List实例反射静态方法反射调用索引器委托遇到协变和逆变C++CLI

使用集合委托方法 先看看.NET一个返回列表数据方法: //返回List或者数组,不影响 C++调用 public List GetUsers(string...在C++端看来,SaveUsers方法参数对象是一个集合,但是具体是什么对象并不知道,所以需要反射出集合类型,同时还需要构建这样一个集合对象实例。...创建List实例 我们使用List来做集合对象,在C#中,我们可以通过下面的方式得到List类型,然后进一步创建对象实例: Type t= typeof(List); 但是,对应C+...为什么要反射创建实体? 因为CreateGenericList(interfaceType) 创建一个List对象,要求它成员是一个实体。...一切准备就绪,下面可以通过以下步骤提交集合数据.NET方法了: 1,反射.NET方法,获取参数形参类型; 2,创建此形参List对象实例; 3,遍历C++集合(列表list),将结构数据赋值动态创建实体对象

9K100

精:C#这些年来受欢迎特性

Jeffery Richter 在他 CLR via C# 一书中提醒了我们显式接口实现两个主要问题是值类型实例在投射到一个接口和明确实现方法时将被装箱,同时不能被派生调用。...不要误解我意思,我同时也写了一些迭代器,在 C# 同样中值得采用! 让我们更详细地看看。...编者注:学习如何 在 C#使用来提高应用程序可维护性 向.NET Framework引入了类型参数概念,这使得可以设计和方法来推迟一个或多个类型规范,直到或方法被客户端代码声明和实例化为止...解决了这一切,同时也增加了类型安全性。让我们修改前面的例子,在中包含一个类型参数 T ,并注意方法签名变化。...在评估 await 关键字时,控制流将返回调用者,并在该方法中那一点暂停执行。等待操作完成时,会同时恢复执行。

14230

C# 这些年来受欢迎特性

Jeffery Richter 在他 CLR via C# 一书中提醒了我们显式接口实现两个主要问题是值类型实例在投射到一个接口和明确实现方法时将被装箱,同时不能被派生调用。...不要误解我意思,我同时也写了一些迭代器,在 C# 同样中值得采用! 让我们更详细地看看。...编者注:学习如何 在 C#使用来提高应用程序可维护性 向.NET Framework引入了类型参数概念,这使得可以设计和方法来推迟一个或多个类型规范,直到或方法被客户端代码声明和实例化为止...解决了这一切,同时也增加了类型安全性。让我们修改前面的例子,在中包含一个类型参数 T ,并注意方法签名变化。...在评估 await 关键字时,控制流将返回调用者,并在该方法中那一点暂停执行。等待操作完成时,会同时恢复执行。

15320

C# 基础知识系列- 5 反射和

前言 为什么要把反射和放在一起讲呢,这里是处于个人对C#一个很棒观感,因为C#反射是可以获取元素,而不像Java一个让我比较难受地方就是Java实际编译时候会擦除类型信息。...那么什么是呢,先看看百度百科定义: 是程序设计语言一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。...使用 做标记,中间写类型,表示这是一个为XXX。通常与其他语言不同地方是,C#支持所有类型,意思就是在没有额外声明时候,可以使用任意类型作为参数传递。...这里简单介绍一下方法使用: 方式1 隐藏了一个参数,这是因为如果是参数的话,c#会根据参数类型自动解析对应类型是什么,方式1 等同于TemplateMethod(10);...方式2 参数是返回值时,必须告知具体类型。

1.5K60

C#详解

使用 下面是用来重写上面的栈,用一个通用数据类型T来作为一个占位符,等待在实例化时用一个实际类型来代替。...实例化理论 C#在编译时,先生成中间代码IL,通用类型T只是一个占位符。...通用类型T没有特指,但因为C#中所有的都是从object继承来,所以他在Node编写中只能调用object方法,这程序编写造成了困难。...由以上示例可知,C#是在实例方法被调用时检查重载是否产生混淆,而不是在本身编译时检查。同时还得出一个重要原则: 一般方法与方法具有相同签名时,会覆盖方法。...使用范围 本文主要是在中讲述,实际上,还可以用在方法、接口、结构(struct)、委托等上面使用使用方法大致相同,就不再讲述。 小结 C# 是开发工具库中一个无价之宝。

1.2K60

C# 学习笔记(15)—— C# 4.0

,这样编译器将判断参数名称是否正确,然后将指定值赋对应参数,从而达到省略第二个参数目的 可变性 在 C# 2.0 中,并不具备可变形,这种可变形是指协变性和逆变性。...C# 2.0 确实是不支持,但因为有了这样需求,微软便适应地做出了改进,在 C# 4.0 中引入了协变性和逆变性 协变性 协变性指的是类型参数可以从一个派生隐式地转换为基 C# 4.0...引入out关键字来标注参数,以示支持协变性,为了更好说明,下面使用 .Net 库中public interface IEnumerable接口为例,做协变性演示: class...,反之则失败 逆变性 逆变性是指类型参数可以从一个隐式地转换为派生C# 4.0 引入in关键字来标记参数,以示其支持逆变性,下面以 .Net 库中接口public interface...并不是所有类型都支持类型参数协变和逆变性,下面总结了使用两个特性时需要注意地方 只有借口和委托才支持协变和逆变(如Func、Action),方法类型参数都不支持协变和逆变

18520

了解C#协变和逆变

这些示例假定一个名为 Base 一个名为 Derived派生。 Covariance 使你能够使用比原始指定类型派生程度更大类型。...在C#中,目前只有接口和委托可以支持协变和逆变, 协变(Covariance) 内置协变接口,IEnumerator、IQuerable、IGrouping<Tkey, TElement...); Action fooAction = fooBaseAction; 而对于逆变,则跟协变相反,有下面的约束,否则也是编译时报错: 要想标识为逆变,应该是要在占位符T前标识in,只能用于写属性...、方法或者委托输入参数 要进行类型转换,占位符T要转换目标类型也必须是其子类,上述例子则是FooBase转为Foo 总结 协变和逆变只对委托和接口有效,对普通方法无效 协变和逆变类型必须是引用类型...,因为值类型不具备继承性,因此类型转换存在不兼容性 接口和委托可同时存在协变和逆变类型参数,即占位符T 参考 协变和逆变 | Microsoft Docs 《你必须知道.NET(第2

89410

C#详解

使用 下面是用来重写上面的栈,用一个通用数据类型T来作为一个占位符,等待在实例化时用一个实际类型来代替。...实例化理论 C#在编译时,先生成中间代码IL,通用类型T只是一个占位符。...通用类型T没有特指,但因为C#中所有的都是从object继承来,所以他在Node编写中只能调用object方法,这程序编写造成了困难。...由以上示例可知,C#是在实例方法被调用时检查重载是否产生混淆,而不是在本身编译时检查。同时还得出一个重要原则: 一般方法与方法具有相同签名时,会覆盖方法。...使用范围 本文主要是在中讲述,实际上,还可以用在方法、接口、结构(struct)、委托等上面使用使用方法大致相同,就不再讲述。 小结 C# 是开发工具库中一个无价之宝。

94821

C#中数组、ArrayList和List区别

我们总结一下ArrayList缺点 不安全类型 装箱拆箱性能损耗高 List 因为ArrayList存在不安全类型与装箱拆箱缺点,所以出现了概念。...List是ArrayList等效,它大部分用法都与ArrayList相似,因为List也继承了IList接口。...总结 相较于数组,ArrayList和List十分灵活,可以自动扩容、轻松插入新元素,此外,由于继承了IList,后者在检索数据十分强大 数组可以具有多个维度,而ArrayList或List始终具有一个维度...不过,在不需要重新分配时(即最初容量十分接近列表最大容量),List性能与同类型数组十分近 在决定使用List还是使用ArrayList(两者具有类似的功能)时,记住List对类型T使用引用类型,则两个行为是完全相同。但是,如果对类型T使用值类型,则需要考虑实现和装箱问题

18330

一文搞定知识

一、 C# 没有 在 .NET 2.0 以前没有时候,开发人员一直在使用 System.Collections.Stack ,它是一个栈类型集合对象。...通过前面的描述部分读者应该看出来了 Stack 不是类型安全,因此在不使用情况下,我们如果修改 Stack 并保证它是类型安全,并且要求它存储指定类型的话,我们必须这么做: public...二、概述 类型是 C# 2.0 引入,它引入在一定程度上减轻了开发人员压力,同时也使得程序变得更加健壮和稳定。语法也很简单,用尖括号声明类型参数和提供类型实参即可。...4.多类型参数 前面我们所讲都是单个类型参数,但是类型不仅仅只能具有一个参数,它可以具有无限多参数,例如我们定义一个,它构造函数接受两个不同类型参数,代码可以这么实现。...这里有一点需要注意如果同时指定了多种约束,那么类型约束必须位于第一位(第一个出现),并且约束中是不允许使用多个类型约束,这是因为我们代码不可能从多个不想管中派生出来,同样类型约束也不能指定密封或者不是类型

95910

C#入门集合、方法、约束、委托

第一次接触那还是在大二上学期时候,那会是学c#面向对象时候接触过集合,但尴尬是那会还没有“”这个概念,仅仅只停留在集合使用。...简介: 是.NET Framework2.0新增一个特性,在命名空间System.Collections.Generic,包含了几个新基于集合,官方建议.net 2.0 及更高版本应用程序使用心得集合...针对不同类型具有相同行为时候,也就是发挥作用时候。 优点: 1.使用、方法,我们可以极大提高代码重用性,不需要对类型不同代码相同(仅类型参数不同)代码写多次。...所以.net 2.0程序时应该放弃使用ArrayList,推荐使用使用List《T》 集合。这也是我们为什么要使用原因之一。...与其他约束一起使用时,new() 约束必须最后指定。 where T: 类型参数必须是指定或派生自指定

2.5K30

用了这么多年 Java ,你对它到底有多了解?

用大白话讲就是这个存在源码中,编译器将源码编译成字节码之时,就会把『擦除』,所以字节码中并不存在。 对于下面这段代码,编译之后,我们使用 javap -s class 查看字节码。 ?...ps:并不是每一个参数被擦除类型后都会变成 Object ,如果类型为 T extends String 这种方式,最终擦除之后将会变成 String。...所以当时 Java 给出一个简单粗暴解决方案:既然没办法做到转换,那就索性不支持原始类型了。 如果需要使用,那就规定使用相关包装,比如 ArrayList。...另外为了开发人员方便,顺便增加了原生数据类型自动拆箱/装箱特性。 正是这种「偷懒」做法,导致现在我们没办法使用原始类型,又要忍受包装装箱/拆箱带来开销,从而又带来运行效率问题。...所以 Java 这种类型擦除式实现方式无论使用效果与运行效率,还是全面落后于 C# 具现化式

69910

C#中什么是

大家好,又见面了,我是你们朋友全栈君。 参考视频 c#教程 集合与非集合最大区别在于,集合,不需要进行装箱和拆箱操作。...为了提高性能及维护类型安全,一般最好采用集合。 如果两个内容完全一样,只是处理数据类型不同。那么,采用一个不错选择。 用于封装不是特定于具体数据类型操作,通常用于集合。...Generic —— 集合 集合 与非集合相比,使用集合有许多优点,如集合元素为值类型时,则集合类型性能会优于对应集合类型;并优于从非集合派生出来类型,为提高性能并获得类型安全...,通常情况下建议使用集合。...通过可以定义类型安全,而不会损害类型安全、性能或工作效率。须一次性将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。需要使用来将一般类型参数括起来。

44710
领券