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

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...由于IComparer接口泛型参数只支持逆变,不支持协变,所以不能把IComparer类型隐式地转换为IComparer,所以会出现编译错误 协变和逆变的注意事项

25820

一文搞定泛型知识

一、当 C# 没有泛型 在 .NET 2.0 以前没有泛型的时候,开发人员一直在使用 System.Collections.Stack 类,它是一个栈类型的集合对象。...在 C# 中不仅仅存在泛型类,还存在泛型接口和泛型结构。...类类型约束 当我们需要将类型实参转换为特定的类类型时就需要用到 类类型约束。类类型约束的语法和接口约束语法相同。...由于派生的泛型类类型参数时泛型基类的类型实参,所以类型参数必须具有等同于或者强于泛型基类的约束条件。 Tip 2:泛型方法同样也可以使用约束,约束条件和泛型类类似。...由于派生的泛型类类型参数时泛型基类的类型实参,所以类型参数必须具有等同于或者强于泛型基类的约束条件。 Tip 2:泛型方法同样也可以使用约束,约束条件和泛型类类似。

1K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    苏州同程旅游学长给我的全面的面试知识库

    当我们想通过网络传输对象时,我们必须将对象转换为字节流。将对象转换为字节流的过程称为序列化。为了使对象可序列化,它应该实现ISerialize接口。反序列化是从字节流中创建对象的反向过程。...如果我们强制将密封类指定为基类,则会发生编译时错误。 18、什么是方法重载? 方法重载是在同一个类中创建多个具有相同名称且具有唯一签名的方法。编译时,编译器使用重载解析来确定要调用的特定方法。...26、接口和抽象类有什么区别? 接口具有所有仅具有声明但没有定义的方法。在抽象类中,我们可以有一些具体方法。在接口类中,所有方法都是公共的。抽象类可以具有私有方法。...循环引用是指两个或多个资源相互依赖导致锁定条件并使资源无法使用的情况。 29、 C#.NET中的泛型是什么? 泛型用于制作可重用的代码类,以减少代码冗余,提高类型安全性和性能。...泛型提倡使用参数化类型。 30、什么是.NET中的对象池? 对象池是具有准备使用的对象的容器。它跟踪当前正在使用的对象,池中的对象总数。这减少了创建和重新创建对象的开销。

    3K20

    C#规范整理·泛型委托事件

    基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了泛型类及泛型方法中的转型,确保了类型安全。...约束使泛型参数成为一个实实在在的“对象”,让它具有了我们想要的行为和属性,而不仅仅是一个object。 指定约束示例: 指定参数是值类型。...where T:class 指定参数具有无参数的公共构造方法。where T:new() 注意,CLR目前只支持无参构造方法约束。 指定参数必须是指定的基类,或者派生自指定的基类。...11.使用泛型参数兼容泛型接口的不可变性# 让返回值类型返回比声明的类型派生程度更大的类型,就是“协变”。...# 逆变是指方法的参数可以是委托或泛型接口的参数类型的基类。

    27830

    C# 中关于 T 泛型

    前言 C# 里面的泛型不仅可以使用泛型函数、泛型接口,也可以使用泛型类、泛型委托等等。在使用泛型的时候,它们会自行检测你传入参数的类型,因此它可以为我们省去大量的时间,不用一个个编写方法的重载。...,再创建一个 Stack 类的一个实例 由于引用类型的数量因程序不同而有较大差异,因此通过将编译器为引用类型的泛型类,创建的专用类的数量减少至 1,这样泛型的 C# 实现,可极大减少代码量。...where T : 基类名> 类型参数必须是指定的基类或派生自指定的基类。在可为 null 的上下文中,T 必须是从指定基类派生的不可为 null 的引用类型。 where T : 基类名>?...类比上一条,增加了基类派生的可为 null 的引用类型。 where T : 接口名称> 类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。...例如,基类约束告诉编译器,仅此类型的对象或派生自此类型的对象可用作类型参数。编译器有了此保证后,就能够允许在泛型类中调用该类型的方法。

    34540

    C# 发展历史及版本新功能介绍

    泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有以下特征的类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个或多个类型。...应尽可能使用这些类来代替某些类,如 System.Collections 命名空间中的 ArrayList。 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。...可以对泛型类进行约束以访问特定数据类型的方法。 在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。 分部类型 可以将类或结构、接口或方法的定义拆分到两个或更多个源文件中。...各个部分可以指定不同的基接口,最终类型将实现所有分部声明所列出的全部接口。 在某一分部定义中声明的任何类、结构或接口成员可供所有其他部分使用。 最终类型是所有部分在编译时的组合。...可以将 Lambda 表达式转换为该类型的委托,因为该表达式也具有一个输入参数 (x),以及一个编译器可隐式转换为 int 类型的返回值。 (以下几节中将对类型推理进行详细讨论。)

    4.2K20

    C# 中关于泛型

    前言 C# 里面的泛型不仅可以使用泛型函数、泛型接口,也可以使用泛型类、泛型委托等等。在使用泛型的时候,它们会自行检测你传入参数的类型,因此它可以为我们省去大量的时间,不用一个个编写方法的重载。...,再创建一个 Stack 类的一个实例 由于引用类型的数量因程序不同而有较大差异,因此通过将编译器为引用类型的泛型类,创建的专用类的数量减少至 1,这样泛型的 C# 实现,可极大减少代码量。...where T : 基类名> 类型参数必须是指定的基类或派生自指定的基类。在可为 null 的上下文中,T 必须是从指定基类派生的不可为 null 的引用类型。 where T : 基类名>?...类比上一条,增加了基类派生的可为 null 的引用类型。 where T : 接口名称> 类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。...例如,基类约束告诉编译器,仅此类型的对象或派生自此类型的对象可用作类型参数。编译器有了此保证后,就能够允许在泛型类中调用该类型的方法。

    45720

    编码最佳实践——里氏替换原则

    因为不使用泛型类型,C#方法的返回类型就不是协变的。换句话说,这种情况下(普通类)的继承是不具备协变能力的。...类的客户端无需再做向下的类型转换,因为直接得到就是User类型对象,而不是Entity类型对象。...错误信息告诉我们,无法将EntityEqualityComparer转换为IEqualityComparer类型。直觉就是这样,因为Entity是基类,User是子类型。...具体到实现层面,定义中没有对in和out关键字的引用,这二者分别用来指定逆变和协变。C#语言的方法参数类型和返回类型都是不可变的,只有在设计泛型时才能将类型定义为可协变的或可逆变的。...需要理解契约和变体的概念才可以应用Liskov替换原则编写具有更高自适应能力的代码。理想情况下,不论运行时使用的是哪个具体的子类型,客户端都可以只引用一个基类或接口而无需担心行为变化。

    1.3K20

    C#2.0新增功能06 协变和逆变

    这样,不仅可以将具有匹配签名的方法分配给委托,还可以分配与委托类型指定的派生类型相比,返回派生程度更大的类型的方法(协变)或接受具有派生程度更小的类型的参数的方法(逆变)。...有关详细信息,请参阅泛型接口中的变体 (C#) 和委托中的变体 (C#)。《C#4.0新增功能03 泛型中的协变和逆变》 以下代码示例演示泛型接口的隐式引用转换。...凭借 C#,能够创建自己的变体接口和委托。 有关详细信息,请参阅创建变体泛型接口 (C#) 和委托中的变体 (C#)。...相关主题 Title 说明 泛型接口中的变体 (C#) 讨论泛型接口中的协变和逆变,提供 .NET Framework 中的变体泛型接口列表。...使用委托中的变体 (C#) 演示如何使用非泛型委托中的协变和逆变支持以将方法签名与委托类型相匹配。

    1K10

    .NET面试题系列 - 泛型

    “可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用。“ - Jon Skeet 泛型 泛型相比反射,委托等较为抽象的概念要更接地气得多,而且在平常工作时,我们几乎时刻都和泛型有接触。...因为object没有实现IComparable接口。 泛型约束分为如下几类: 接口约束:泛型实参必须实现某个接口。接口约束可以有多个。 基类型约束:泛型实参必须是某个基类的派生类。...基类型约束必须放在其他约束之前。 构造函数new()约束:泛型实参必须具有可访问的无参数构造函数(默认的也可)。new()约束出现在where子句的最后。...协变和逆变 可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用。其对应的术语则是不变性(invariant)。 可变性 可变性是以一种类型安全的方式,将一个对象作为另一个对象来使用。...注意,协变和逆变性体现在泛型类T和T的派生类。目前out 和in 关键字只能在接口和委托中使用。

    72730

    【C#学习笔记之一】C#中的关键字

    :受保护成员可在其所在的类与派生类访问 abstract 在类中使用adstract指示某个类只能是其他类的基类。...分部类型定义允许将类、结构或接口的定义拆分到多个文件中。 readonly 声明一个字段,该字段只能赋值为该声明的一部分或者在同一个类的构造函数中。...本节介绍下列关键字: as 将对象转换为可兼容类型。 is 检查对象的运行时类型。 new new 运算符 创建对象。 new 修饰符 隐藏继承成员。 new 约束 限定类型参数。...var 使编译器能够确定在方法作用域中声明的变量的类型。 where 将约束添加到泛型声明。(另请参见where)。 yield 在迭代器块中使用,用于向枚举数对象返回值或发信号结束迭代。...where 根据一个或多个由逻辑“与”和逻辑“或”运算符(&& 或 ||)分隔的布尔表达式筛选源元素。 select 指定当执行查询时返回的序列中的元素将具有的类型和形式。

    2.4K50

    C#4.0新增功能03 泛型中的协变和逆变

    Action 泛型委托(如 Action)具有逆变参数类型。 这意味着,可以将委托指派给具有派生程度较高的参数类型和(对于 Func 泛型委托)派生程度较低的返回类型的变量。...从 .NET Framework 4 开始,Visual Basic 和 C# 提供了一些关键字,利用这些关键字,可以将接口和委托的泛型类型参数标记为协变或逆变。...可以将逆变类型参数用作属于接口的方法的参数类型,或用作委托的参数类型。 也可以将逆变类型参数用作接口方法的泛型类型约束。 只有接口类型和委托类型才能具有 Variant 类型参数。...接口或委托类型可以同时具有协变和逆变类型参数。 Visual Basic 和 C# 不允许违反协变和逆变类型参数的使用规则,也不允许将协变和逆变批注添加到接口和委托类型之外的类型参数中。...有关信息和示例代码,请参阅泛型接口中的差异 (C#) 和泛型接口中的差异 (Visual Basic)。

    1.3K20

    C# 的多态

    在C#中,多态性通过抽象类和接口实现,使得同一个方法调用可以作用于不同的对象类型上。本文将深入探讨C#中的多态性,包括它的基本概念、实现方式、以及如何在实际编程中有效使用多态性。1....多态性的基本概念1.1 什么是多态性多态性指的是同一个操作作用于不同的对象时,可以有不同的解释和不同的执行结果。在C#中,多态性主要通过方法重载(编译时多态)和方法重写(运行时多态)实现。...1.2 方法重载方法重载是同一个类中具有相同名称但参数列表不同的方法。...return a + b; } public double Add(double a, double b) { return a + b; }}1.3 方法重写方法重写是派生类中重新定义基类的方法...4.5 考虑使用泛型来提高代码的复用性泛型提供了一种方式来编写与类型无关的代码,这可以提高代码的复用性。

    2.3K10

    了解C#的协变和逆变

    前言 在引用类型系统时,协变、逆变和不变性具有如下定义。 这些示例假定一个名为 Base 的基类和一个名为 Derived的派生类。...Covariance 使你能够使用比原始指定的类型派生程度更大的类型。 你可以将 IEnumerable 的实例分配给 IEnumerable 类型的变量。...Contravariance 使你能够使用比原始指定的类型更泛型(派生程度更小)的类型。 你可以将 Action 的实例分配给 Action 类型的变量。...在C#中,目前只有泛型接口和泛型委托可以支持协变和逆变, 协变(Covariance) 内置的泛型协变接口,IEnumerator、IQuerable、IGrouping的目标类型也必须是其子类,上述例子则是FooBase转为Foo 总结 协变和逆变只对泛型委托和泛型接口有效,对普通的泛型类和泛型方法无效 协变和逆变的类型必须是引用类型

    94810

    C#中的泛型(类型参数的约束)

    首先,来看一个程序,对泛型有一个初步的认识。...下面重点说说C#中泛型类型参数的约束: 在定义泛型类时,可以对客户端代码能够在实例化类时用于类型参数的类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。...T:new() 类型参数必须具有无参数的公共构造函数。 当与其他约束一起使用时,new() 约束必须最后指定。 T:基类名> 类型参数必须是指定的基类或派生自指定的基类。...T:接口名称> 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是泛型的。 T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。...于是,我想能不能写一个简单的泛型类,其中里面实现对数值类型的加减乘除四则运算,遇到的问题是 :where子句后面的约束怎么写,我查看的数值型的类Int32等等,它们的基类是Object,如果直接定义一个泛型参数

    3.7K60

    泛型协变与抗变(二)

    前言   在.NET 4之前,泛型接口是不变的。.NET 4通过协变和抗变为泛型接口和泛型委托添加了一个重要的扩展。协变和抗变指对参数和返回值的类型进行转换。   ...基类-派生类   在函数输出时,函数的输出类型(返回类型)从string转换成object。派生类-基类。   这里就比较接近泛型接口的协变和抗变的概念了。...理解泛型接口的协变和抗变(in、out)   我们下面来看看泛型接口的协变及抗变的例子:   首先我们看下协变,在C#高级编程(第十一版)中指出,如果泛型类型用out关键字标注,泛型接口就是协变的。...在C#高级编程中指出的概念:如果泛型类型用in关键字标注,泛型接口就是抗变的。这样,接口只能把泛型类型T用作其方法的输入。  ...总结   其实在上述例子及其概念中,我们可以发现,泛型接口的协变及抗变,也就是将类型参数返回或者传入的情况,在这情况下进行其类型的隐式转换所遵循的规律。

    82020

    浅谈泛型

    泛型集合类具有更好的对象模型,提供了更多的新功能。 开放类型和封闭类型 具有泛型类型参数的类型仍然是类型,CLR同样会为它创建内部的类型对象。...具有泛型类型参数的类型称为开发类型,CLR禁止构造开放类型的任何实例,这一点类似于CLR禁止构造接口类型的实例。...使用泛型类型并指定类型实参时,实际是在CLR中定义一个新的类型对象,新的类型对象从泛型类型派生自的那个类型派生。...我们现在对约束及其工作方式有了基本的认识。约束可应用于泛型类型的类型参数,也可以应用于泛型方法的类型参数。当重写虚泛型方法时,会自动继承基类方法上的约束,并且不能修改。泛型约束有以下几种: 1....如果允许将类型参数约束成具体的值类型,那么泛型方法会被约束为只支持该具体的类型,这还不如不要泛型呢!

    1K30

    五分钟看完,彻底理解C#的协变逆变

    但是如果我自己写一个: //定义一个工作的泛型接口 public interface IWork { } 实现类 public class Work : IWork...(先假设,再假设) In:那么根据核心依据,子类转父类可以直接转,入参如果限定是Person类型,那么你给我限定为Student或者任意的Person类型的派生类,我都是可以接受的,因为都是安全的,可以直接转换过来的...这种从基类转向派生类的兼容,就是所谓的逆变。 说白了,我让你给我一个人,你说不行,我给你找个学生,那肯定是满足需求的。...这种从派生类转向基类的兼容,就是所谓的协变。 说白了,我可以造个学生,结果你说给个人就行, 那不是so easy。...直接show you code: 当Out作为返回值时的泛型没有问题,但是入参就报错了 当In作为入参时的泛型没有问题,但是返回值就报错了 好了,这还需要再解释吗?

    33220

    【深入浅出C#】章节 2:数据类型和变量:类型转换和类型推断

    以下是在显式类型转换中常见的引用类型之间的转换方式: 向上转换(Upcasting): 向上转换是将派生类的实例转换为基类的实例。 这种转换是安全的,因为派生类的实例具有基类的所有成员。...(Downcasting): 向下转换是将基类的实例转换为派生类的实例。...引用类型之间的隐式转换: 从派生类向基类进行转换是隐式的。派生类的实例可以隐式转换为基类类型。...这在需要使用枚举类型的值进行数值计算或比较时很常见。 类型继承关系下的转换: 将派生类的实例隐式转换为基类类型。 这在面向对象编程中很常见,通过将派生类对象视为基类对象来实现多态性。...泛型类型参数的隐式转换: 在泛型类型中,如果类型参数之间存在隐式转换关系,可以使用隐式转换进行类型参数的传递。 这在泛型算法和数据结构中很常见,可以更灵活地处理不同类型的数据。

    46810
    领券