学习
实践
活动
专区
工具
TVP
写文章

来实现编译时期类型推断

第一章都是讲,距离上一篇Effective C#随笔已经是很久以前事情了。。。 今天Item4,讲的是类型推断功能。 东西好不好,都是比较出来了,当然也不是绝对好或者绝对不好。 首先上一段不用代码。 证明,错了,确实是Exception,再看一下代码,factory实例化时候传入了参数theType。为什么要传这个参数呢?想应该还是性能问题吧。 解决了原先几个问题。 ①类型转换。类中LoadFromFile方法,返回类型其实已经被限定了,就是T类型,至于T具体是什么类型,就看自己在调用时候尖括号之间写具体值了。 最后一段: 很多时候如果用了Type类型参数,通常都可以定义出一个版本。编译器就会 “Create the Specific version for you.”。

18430
  • 广告
    关闭

    2023新春采购节

    领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折

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

    C#类型参数约束)

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

    1.1K60

    C# 数据类型判定与转换

    提到类型转换,首先要明确C#数据类型,主要分为值类型和引用类型: 1.常用类型有:(struct) 整型家族:int,byte,char,short,long等等一系列 浮点家族:float,double 当然了,无论是装箱和拆箱,对于性能都是有消耗,不到万不得已时候尽量不要用(虽然才不管这些,只要爽就行了233) 虽然一般不提倡用object类型作为函数参数,取而代之使用成为首选,那么如何判断参数具体数据类型并进行有效转换呢 ,包含标签,具体值和属性类别(是主属性还是副属性),并使用约束数据为值类型。 现在想要快速对这个结构体进行加法操作,于是增加操作符重载函数,方便愉快对两个属性值相加,但问题是是无法强转为任何一种非object数据类型,直接相加则更是不可能。 .Net 4.0 以后开始支持动态数据类型——也就是dynamic关键字;令人兴奋是,dynamic可以被赋值为任何一种类型值,当然也包括

    1.6K30

    听了他讲就明白为什么工资比我多30万了!

    运行在JVM中也是一样,那你可能会有疑问,既然将类型擦除了,那为什么声明为String类型时,不能往里add一个整型数据呢? 2、不能用来方法重载 为什么呢?举个例子: ? 如上图所示,在不同作为参数时,编译器编译时进行类型擦除,那参数不就一样了吗?那还谈什么重载呢! 而C#没有进行类型擦除,所以编译完后是带有类型,所以可以当作是重载。 3、类型不能当作真实类型使用 ? 上图中展示了5种使用方式,除了第四种Java能正常使用,其他Java都不能使用,而C#完全没问题。 4、静态方法无法引用类类型 ? Java中是类实例化时候才能确定准确类型,而静态方法是不需要类实例化就能调用,显然不能使用。 5、类型强转开销 ?

    28121

    .NET深入解析LINQ框架(一:LINQ优雅前奏)

    从这点上看Lambda明显要比匿名委托强大很多,最重要是它还支持类型推断特性。 那么什么是类型推断? (这里要记住目前IDE编辑器只支持方法调用类型推断,也就是说其他方面的使用是不支持隐式类型推断,还是需要我们手动加上类型实参。) 类型推断不足之处; 当然类型推断还存在不足地方,这里可以顺便参见一下我们老赵大哥一篇文章:“C#编译器对方法调用作类型推断奇怪问题”;在实际工作中也遇到过一个很头疼问题,这里顺便跟大家分享一下 按照常理说方法形参里面定义一个委托,他们形参类型都是一样占位符,但是如果使用带有形参方法作为委托参数的话是无法进行类型推断,然后使用无参数方法作为委托参数是完全没有问题。 但是如果使用GetOrderListByModel作为GetModelList<TSource, TResult>(Func<TSource, TResult> GetFunc)重载版本方法时就不能真确推断类型

    45730

    认为,数组协变机制是C#早期一处设计失误。有关数组协变内容超出了本书范畴,暂不讨论。 对于这些无法声明为类型成员,通常很难想象出它们如何才能成为。有时也有编写构造器或者索引器需求,可最后往往是用一个方法就实现了同样功能。 直接调用构造器实现代码比较烦琐:new Tuple<int, string, int>(10, "x", 20) 但是使用静态方法配合类型推断,代码就简单多了4:4前面说过构造器不能,构造器中参数实际上是来自它所在类类型形参 C#语言设计团队一直致力于让类型推断能够应用于更多场景,在此探索过程中,类型推断实现原理也在不断更新变化。 C# 2截至目前最庞大一个特性了,也是对C# 1一项重大改进。下面介绍可空值类型,此项特性正是基于建立

    12410

    一文搞定知识

    定义和使用就这么多,是不是很简单呢?下面我们就来讲解一下各个方面。在学习类之前我们要先来了解一下它优点,来看看为什么微软在 C# 2.0 中引入了类。 嵌套类型外层也是一个类型,外层这个类型通常被称为包容类型,嵌套类型会自动获得包容类型类型参数,这段话有些绕口,详细讲解一下。 方法和类相比有一个很特别的地方,就是方法可以自己推断类型。编译器可以根据传给方法实参来推断参数类型。因此如果想让方法类型推断成功那么实参类型必须与方法形参相匹配。 在这里通过简单几句来说一下约束继承。首先无论是类型参数还是它们约束都不会被 派生类 继承,这是因为类型参数和约束不是类成员。虽然不能被派生类继承,但是可以被从其派生类所继承。 六、总结 这篇文章主要讲解了一些知识,不能说很全面,但已经覆盖了百分之九十内容。在开发中可以说是经常用到,良好使用可以提高代码复用率以及程序运行性能。

    23810

    C#协变和逆变

    msdn 解释如下:  “协变”是指能够使用与原始指定派生类型相比,派生程度更大类型。  “逆变”则是指能够使用派生程度更小类型。  解释很正确,大致就是这样,不过不够直白。  正因如此,所以微软新增了两个关键字:Out,In,下面是他们msdn解释: 协变英文是:“covariant”,逆变英文是:“Contravariant” 为什么Microsoft选择是”Out out: 输出(作为结果),in:输入(作为参数) 所以如果有一个参数标记为out,则代表它是用来输出,只能作为结果返回,而如果有一个参数标记为in,则代表它是用来输入,也就是它只能作为参数 想要回答这个问题需要在回头看看Clr via C# 关于和接口章节了,就不解释了,  答案是不可以。  上面演示是协变,接下来要演示下逆变。  In 关键字:逆变,代表输入,代表着只能被使用,不能作为返回值,所以C#编译器可以根据in关键字推断这个类型只能被使用,所以Action<Dog> actionDog = actionAnimal;

    53530

    十分钟教你理解TypeScript中

    你将在本文中学到什么 本文介绍TypeScript中(Generics)概念和用法,它为什么重要,及其使用场景。我们会以一些清晰例子,介绍其语法,类型和如何构建参数。 然而,不要把TypeScript中错当成any类型来使用——你会在后面看到这两者不同。 类似C#和Java这种语言,在它们工具箱里,是创建可复用代码组件主要手段之一。 这是因为,TypeScript现在可以从指定类型推断出001不是字符串。在T出现地方,就可以使用string类型,这就实现了类型安全。 使用,许多属性类型都能被TypeScript推断出来,然而,在某些TypeScript不能做出准确推断地方,它不会做任何假设。 但理解了它,你就能看到在使用时,设置约束是多么有用。 为什么 一个活跃于Stack Overflow社区成员,Behrooz,在后续内容中很好回答了这个问题。

    50210

    C#:昨天,今天和明天:和 Anders Hejlsberg 座谈,第二部分

    Hejlsberg: 首先,非常高兴我们在2.0里面加入了编程。你现在看我们做C# 3.0 里面的很多东西都是在起作用。 现在我们抛开表面看本质,Java 和 C# 实现机制是截然不同认为最大不同在于:.NET平台下不只是一个语言特色。根植于 CLR 和 .NET 类型系统。 这也就是为什么可以在运行时候表现出来。 而 Java 则选择了另一个不同方式实现,一言以蔽之,他们是在编译时实现。 相对于我们实现来说,java 不能带来性能收益,很显然吗,不管外表 List<T> 看起来多么,Java 在运行时压根没这马事儿,你不得不自己做运行时动态检查和类型转换。 还可以说:为什么不给我一个 System.Type List<T>也可以是,你为什么没有把 T 绑定到 Order ?也就是说我们可以把类型转换为 List<Order> ,并创建他一个实例。

    40131

    C#语法糖

    二.隐式类型(var) var定义变量有一下四个特点: 1、必须在定义时初始化 2、一旦初始化完成,就不能再给变量赋与初始值不同类型值了 3、var要求是局部变量 4、使用var定义变量和object 不同,它在效率上和使用强类型方式定义变量完全一样 三.参数默认值和命名参数 C#方法可选参数是.net 4.0最新提出功能,对应简单重载可以使用可选参数和命名参数混合形式来定义方法,这样就可以很高效提高代码运行效率 调用其方法时,可以重新指定分配了默认值参数,也可以使用默认值。重新指定分配默认值参数时,可以显式地为指定参数名称赋值;隐式指定时候,是根据方法参数顺序,靠C#编译器推断。 它必须放在一个非嵌套、非静态类中(静态方法);它至少有一个参数;第一个参数必须附加this关键字;第一个参数不能有任何其他修饰符(out/ref).第一个参数不能是指针类型。 七、内置委托 Action<T> 可以使用Action<T>委托以参数形式传递方法,而不用显示声明自定义委托。

    35220

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

    可能大多数人刚学习时候觉得很难理解,当然也是这样,所以便写下这篇文章加深一下对印象。 定义主要有以下两种: 1.在程序编码中一些包含类型参数类型,也就是说参数只可以代表类,不能代表个别对象。(这是当今较常见定义) 2.在程序编码中一些包含参数类。 所以.net 2.0程序时应该放弃使用ArrayList,推荐使用使用List《T》 集合。这也是我们为什么要使用原因之一。 ###类型参数约束### 为什么要使用类型参数约束呢,简单点说就是筛选类型参数,在使用代码中如果违反了某个约束不允许类型来实例化则会产生编译错误,类型参数约束是使用关键字where。 : “类型Product必须是不可以为NUll值得类型”,引用类型默认值就是NULL,所以该房方法类型参数不能是引用类型,这就是使用类型参数约束好处。

    17230

    C#用处

    心里那个佩服啊… 虽然坐在那里没有听课,但我却不闲着,拿出手机打开电子书,看起.NET应用文章来。 他是类型安全。实例化了int类型栈,就不能处理string类型数据,其他数据类型也一样。 2. 无需装箱和折箱。 C#几个特点 如果实例化类型参数相同,那么JIT编译器会重复使用该类型,因此C#动态能力避免了C++静态模板可能导致代码膨胀问题。 C#类型携带有丰富元数据,因此C#类型可以应用于强大反射技术。 当然,C#还很多应用,现在还只是了解了它机制和原理,在接下来学习中我会系统得学习所支持抽象,接口,结构和委托等!

    21410

    C++ Template 基础篇(一):函数模板

    大家好,又见面了,是你们朋友全栈君。 Template 基础篇-函数模板 Template所代表编程是C++语言中重要组成部分,将通过几篇blog对这半年以来学习做一个系统总结,本文是基础篇第一部分。 Template 基础篇-函数模板 为什么要有编程 函数模板定义 普通函数模板 成员函数模板 为什么成员函数模板不能是虚函数virtual 实参推断 如何使用 当返回值类型也是参数时 实参推断自动类型转换 函数模板重载 模板函数特化 为什么要有编程 C++是一门强类型语言,所以无法做到像动态语言(python javascript)那样子,编写一段通用逻辑,可以把任意类型变量传进去处理。 编程弥补了这个缺点,通过把通用逻辑设计为模板,摆脱了类型限制,提供了继承机制以外另一种抽象机制,极大地提升了代码可重用性。

    81920

    C#

    C# 2008-12-17 作者: 张子阳 分类: C# 语言 .Net 1.1版本最受诟病一个缺陷就是没有提供对支持。 通过使用,我们可以极大地提高代码重用度,同时还可以获得强类型支持,避免了隐式装箱、拆箱,在一定程度上提升了应用程序性能。本文将系统地为大家讨论,我们先从理解开始。 为什么要有想不论大家通过什么方式进入了计算机程序设计这个行业,都免不了要面对数据结构和算法这个话题。 ,.Net框架内置快速排序算法不能满足要求,所以我们考虑自己实现一个自己排序算法,注意到SuperSearch()和SuperSort()方法接受参数类型不同,所以我们最好定义一个来解决,我们将这个算法叫做 这里想说是一个有趣编译器能力,它可以推断出你传递数组类型以及它是否满足了约束,所以,上面的SpeedSort()方法也可以像下面这样调用: calculator.SpeedSort(bookArray

    30170

    (持续整理中)Visual Studio 中 C# 代码分析规则集中每一项含义 (stylecop ruleset)

    更新于 2018-03-23 13:56 因为希望在要求很高库中及时发现潜在代码问题,所以我开启了 Visual Studio 代码分析 但是在修改规则时候发现规则名称都是在用每一个字描述一点都不懂概念,于是打算一个个尝试以找出每一个代码分析实际意义。 在整理过程当中,发现要么是名称看不懂,要么是错误提示看不懂。 ---- 正在整理中…… 代码分析(Microsoft.Analyzers.ManagedCodeAnalysis) 设计问题 编号 名称 含义 CA1004 方法应提供类型参数 如果方法参数列表中没有用到声明所有 ,那么就会出现此提示(这是因为此时不能被隐式推断,库使用者学习成本会提高,详见:CA1004) CA1005 避免类型参数过多 如果写时候有超过 2 个类型,就会出现此提示 CA1006 不要将类型嵌套在成员签名中 如果出现类似 Func<Task<T> 这样嵌套出现在方法参数签名中,则会出现此提示 CA1018 用 AttributeUsageAttribute 标记特性

    87220

    30分钟教程

    类型不安全 四、示例: 像List<T>和Dictionary<TKey,TValue>之类类型我们经常用到 下面介绍几个不常用到类型 ObservableCollection< .NET类库里有很多接口 比如:IEnumerator<T>、IList<T>等 这里不对这些接口做详细描述了 值说说为什么要有接口。 (2); obj.CompareTo("123"); 有人会问:“这不可能,没有指定CompareTo方法TParam类型,肯定会编译出错告诉你:不会,编译器可以帮你完成类型推断工作。 注意: 如果你为一个方法指定了两个参数,而且这两个参数类型都是T, 那么如果你想使用类型推断,你必须传递两个相同类型参数给这个方法 不能一个参数用string类型,另一个用object类型,这会导致编译错误 注意: 只有接口和委托类型才可以使用逆变和协变特性 参考资料 Mgen博客 CLR VIA C#(第三版)

    32060

    C#历代版本新特性——面试题常用

    ,通过反射可以访问特性信息 Literals:字面值(或理解为常量值),区别常量,常量是和变量相对 C#2.0新特性 及其相关,匿名方法 2.0版本C#语言和公共语言运行时(CLR)中增加了 类型参数概念引入.NET Framework,类型参数允许类和方法将一个或多个类型指定延迟到和护短代码声明并实例化该类或方法时候。 当定义实例时,必须指定这个实例所存储实际类型: List<string> lst = new List<string>(); 允许将一个实际数据类型规约延迟至实例被创建时才确定 主要由两个优点: 编译时可以保证类型安全。 不用做类型转换,获得一定性能提升。 co- and contravariance:协变和逆变 Embedded interop types (“NoPIA”):开启嵌入类型信息,增加引用COM组件程序中立性 C# 5特性 (VS

    78190

    关注

    腾讯云开发者公众号
    10元无门槛代金券
    洞察腾讯核心技术
    剖析业界实践案例
    腾讯云开发者公众号二维码

    相关产品

    • 云服务器

      云服务器

      云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。 腾讯云服务器(CVM)为您提供安全可靠的弹性云计算服务。只需几分钟,您就可以在云端获取和启用云服务器,并实时扩展或缩减云计算资源。云服务器 支持按实际使用的资源计费,可以为您节约计算成本。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券