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

为什么C#泛型不能像C++模板中那样从泛型类型参数中派生出来?

在C#中,泛型不能像C++模板那样从泛型类型参数中派生出来,主要原因是C#和C++在泛型实现上有所不同。

C++模板是在编译时进行编译的,而C#泛型则是在运行时进行编译的。这种差异导致了C#泛型不能像C++模板那样从泛型类型参数中派生出来。

在C++模板中,编译器会为每种类型的模板实例生成一个具体的类或函数,这意味着在编译时就可以确定类型参数的具体类型,从而可以从泛型类型参数中派生出具体的类型。而在C#泛型中,由于编译和运行时类型擦除的原因,编译器无法在编译时确定类型参数的具体类型,因此无法从泛型类型参数中派生出具体的类型。

此外,C#泛型还有一些安全和性能方面的考虑。由于泛型是在运行时进行编译的,因此编译器需要确保泛型代码的类型安全和性能。限制泛型类型参数的派生可以帮助编译器确保类型安全和性能。

总之,C#泛型不能像C++模板那样从泛型类型参数中派生出来,主要是因为C#和C++在泛型实现上有所不同,以及为了确保类型安全和性能。

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

相关·内容

C#类型参数的约束)

因为我们的数组存储的元素类型是不确定的,所以这里我们用到了,其中where T : strut子句约束参数类型T必须为值类型。当然这个程序我们不使用,直接定义Object类型的数组也可以。...下面重点说说C#类型参数的约束: 在定义类时,可以对客户端代码能够在实例化类时用于类型参数类型种类施加限制。 如果客户端代码尝试使用某个约束所不允许的类型来实例化类,则会产生编译时错误。...T: 类型参数必须是指定的接口或实现指定的接口。 可以指定多个接口约束。 约束接口也可以是的。 T:U 为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。...于是,我想能不能写一个简单的类,其中里面实现对数值类型的加减乘除四则运算,遇到的问题是 :where子句后面的约束怎么写,我查看的数值的类Int32等等,它们的基类是Object,如果直接定义一个参数...最后,在MSDN上找了找资料,发现C#时没办法实现的。 如果有朋友,发现了解决问题的方法,请分享下!愿共同学习!

3.7K60

一文搞定知识

在 .NET 应用尤其广泛,是在 .NET 2.0 CLR 的增加的一项新功能,类似于 C++模板但不如 C++模板灵活,不过也有一些自己的特性。...的定义和使用就这么多,是不是很简单呢?下面我们就来讲解一下各个方面。在学习类之前我们要先来了解一下它的优点,来看看为什么微软在 C# 2.0 引入了类。...这里有一点需要注意如果同时指定了多种约束,那么类类型约束必须位于第一位(第一个出现),并且约束是不允许使用多个类类型约束的,这是因为我们的代码不可能从多个不想管的类中派生出来,同样类类型约束也不能指定密封类或者不是类的类型...首先无论是类型参数还是它们的约束都不会被 派生类 继承,这是因为类型参数和约束不是类的成员。虽然不能被派生类继承,但是可以被其派生的类所继承。...首先无论是类型参数还是它们的约束都不会被 派生类 继承,这是因为类型参数和约束不是类的成员。虽然不能被派生类继承,但是可以被其派生的类所继承。

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

    我知道我刚才是化的说明,你也可以使用 STL 来作基于模板的编程。标准模板库有他伟大的地方。我只是说,更广泛的背景上看C++写出的应用程序和用 VB 和 C# 写出的程序是应用于不同的目的的。...Hejlsberg:对于C++应用领域的跌落,我感到并不惊讶。 Osborn: 我知道一个人不能C++来写托管代码。 Hejlsberg: 个人出发点来看,我也不会用它来写托管代码。...现在,看看 java 和 C# 这对冤家吧,语法学上面看两者实现的形式是很相似的。他们都像 C++模板,这是继承下来的。...而且 Java 编译器把代码移除了,并注入了对象,有效的对象替代了类型参数信息。也就是说呀,Java 在运行时根本没有这一说。...相对于我们的实现来说,java 的不能带来性能的收益,很显然吗,不管外表 List 看起来多么,Java 在运行时压根没这马事儿,你不得不自己做运行时的动态检查和类型转换。

    86831

    C++编程 ⑧ ( 类模板继承语法 | 普通类 继承 类模板语法 | 类模板 继承 类模板语法 | 继承类模板必须指定具体的类型参数列表 | 继承 类模板 必须重写构造函数 )

    的 子类 : // 类模板 继承时 , 需要具体化 类模板 // 也就是 指定 类模板类型参数列表 , 将 类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小..., 类模板子类 与 普通类子类 区别就是 , 类模板子类 需要在尖括号中指定 具体的 类型参数列表 的 数据类型 ; 此时 , 在继承时 , 被继承的 类模板 必须 声明 类型参数列表 , 将具体的类型写在尖括号...继承时 , 需要具体化 类模板 // 也就是 指定 类模板类型参数列表 , 将 类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存... T , 与 Father 的 T 没有任何关系 , 也就是说 Son2 类型 T 相当于 普通类 继承 类模板 的 具体类型 int , Father 类 T 已经被覆盖掉了...继承时 , 需要具体化 类模板 // 也就是 指定 类模板类型参数列表 , 将 类型 固定下来 // C++ 编译器 只有知道了具体类型 , 才能知道 父类占用内存大小 // 才能正确分配内存

    1K30

    C#的用处

    C#能力由CLR在运行时支持,区别于C++的编译时模板机制,和java的编译时的“搽拭法”。这使得能力可以在各个支持CLR的语言之间进行无缝的互操作。...C#的几个特点 如果实例化类型参数相同,那么JIT编译器会重复使用该类型,因此C#的动态能力避免了C++静态模板可能导致的代码膨胀的问题。...C#采用“基类、接口、构造器、值类型/引用类型”的约束方式来实现对类型参数的“显示约束”,提高了类型安全的同时,也丧失了C++模板基于“签名”的隐式约束所具有的高灵活性。...尽管 C# 的根基是 C++ 模板,但 C# 通过提供编译时安全和支持将提高到了一个新水平。C# 利用了两阶段编译、元数据以及诸如约束和一般方法之类的创新性的概念。...当然,C#还很多应用,现在我还只是了解了它的机制和原理,在接下来的学习我会系统得学习所支持的抽象,接口,结构和委托等!

    1.3K10

    java(一)、的基本介绍和使用

    思想早在C++语言的模板(Templates)中就开始生根发芽,在Java语言处于还没有出现的版本时,只能通过Object是所有类型的父类和类型强制转换两个特点的配合来实现类型化。...技术在C#和Java之中的使用方式看似相同,但实现上却有着根本性的分歧,C#里面泛无论在程序源码、编译后的IL(Intermediate Language,中间语言,这时候是一个占位符)或是运行期的...stackoverflow上有个老外说:java 里如果 一个类继承了另外一个带模板参数的类,那么这个模板参数不会被“类型擦除”。而单一的一个类,其参数会被擦除。 首先说明这种假设是错误的。...那么究竟是什么原因,导致了,一个类(含有模板参数的类),没有C# GetGenericArguments()类似的getGenericClass()函数呢??...因此 C# GetGenericArguments()类似的getGenericClass()函数,在java毫无意义。 这里的毫无意义是指在上面所说的java和jvm的特性的基础上。

    1.5K10

    java面试强基(14)

    Java IO 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java IO 流的 40 多个类都是如下 4 个抽象类基类中派生出来的。...Java 只有值传递?  Java 中将实参传递给方法(或函数)的方式是 值传递 : 如果参数是基本类型的话,很简单,传递的就是基本类型的字面量值的拷贝,会创建副本。...如果参数是引用类型,传递的就是实参所引用的对象在堆地址值的拷贝,同样也会创建副本。 序列化协议对应于 TCP/IP 4 层模型的哪一层? ...因为,OSI 七层协议模型的应用层、表示层和会话层对应的都是 TCP/IP 四层模型的应用层,所以序列化协议属于 TCP/IP 协议应用层的一部分。 什么是擦除?  ​...java是伪,在java编译期间,所有信息会进行擦除。 ​ 编译器在编译期间,会将动态将T擦除为Object或者将T extends xxxxx 擦除为其限定类型 xxxxx。 ​

    16160

    和元编程的模型:Java, Go, Rust, Swift, D等

    具有反射功能的语言以及将其用于序列化的例子包括Java、C#和Go。 动态类型语言 反射是非常强大的,可以完成很多不同的元编程任务,但有一点它不能做,那就是创建新的类型或编辑现有字段的类型信息。...在C++和D中使用的模板使用这种方式,你可以在类型和函数上指定 "模板参数",当你实例化一个具有特定类型模板时,该类型会被替换到函数,然后对函数进行类型检查,以确保组合是有效的。...Rust 下一种类型的单态化,是在类型检查之后,把代码生成的过程再推进一步。上文提到用C++可以动态类型语言中的获取库函数内的错误类型,这是因为模板参数基本只有一种类型。...,这也是为什么Rust可以使用同一个类型系统来支持这两种的原因!...就像我们可以复制带有类型占位符的源代码模板一样,我们可以生成带有特定类型占位符的机器代码。然后我们就可以链接器的一样工作,通过memcpy和一些补丁,很快就可以把这些模板标记出来!

    3.1K30

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

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

    1.7K20

    C#语言和JAVA、C++的对比学习

    在使用的过程,不自觉的以前用过的语言Java和C++比较,发现了很多有趣的地方。 C#语言如果简单的来和Java以及C++对比,一句话的结论就是:C++的外表,JAVA的心。为什么这么说呢?...除了用来构造对象,还可以用来隐藏基类被继承的成员,同时也可以用来在使用约束模板参数必须带有公共的无参数构造器——这点在JAVA里面也是靠所谓JavaBean规范来约定,而C#则直接提供了语言支持...C++模板没有约束的语法,这样导致写模板函数的时候有点碰运气,靠编译检查来约束,而且还不能确定其真正的语意。...但是JAVA和C#都有约束语句,Where关键字还是很有必要的,特别是我们在做一些业务逻辑的时候,需要写模板代码的时候。...C++由于是编译的,语言层面是实现不了的了,IDL之类的方面看可能还有希望。 最后C#支持LINQ,这个玩意太强大,属于独门暗器。

    1.8K40

    最简单的情况下,一个方法可能会这样: public V put(K key, V value) { return cahe.put(key,value); } 9、C++模板和java...鉴于此,Java有时也被称为“语法糖”。   这和 C++模板截然不同。在 C++模板本质上就是一套宏指令集,只是换了个名头,编译器会针对每种类型创建一份模板代码的副本。...由于架构设计上的差异,JavaC++模板有很多不同点:   C++模板可以使用int等基本数据类型。Java则不行,必须转而使用Integer。   ...在Java,可以将模板参数类型限定为某种特定类型。   在C++类型参数可以实例化,但java不支持。   在Java类型参数不能用于静态方法(?)...类型参数会在运行时被抹去。在C++类型参数不同,实例变量也不同。

    1.1K50

    PHP即将引入和集合两大重要特性

    (Generics) 是一种重要的编程范式,它允许程序员在编写代码时使用类型参数,这些类型参数在编译时或运行时可以被具体的类型所替代。的使用能够增加代码的复用性、灵活性和可维护性。...使得这种数据类型能够适用于不同的数据类型,从而实现代码的复用和高效。 PHP是一种动态类型语言,不像C++、Java等语言有强类型机制,因此在PHP实现编程不是一件容易的事情。...PHP 在PHP官方文档,并没有直接提及这个概念。这并不意味着PHP不支持,而是说PHP没有Java或C#那样显式地提供的语法支持。...通过定义一个接口作为类型参数,我们可以实现类似类型检查和类型约束。虽然这种方法与Java或C#有所不同,但它确实提供了一种在PHP实现功能的方式。 一个简单的例子 <?...集合 的一个主要用例是需要类型化数组。在PHP,瑞士军刀数组类型的使用(和滥用)有很多原因。但是你目前不能强制将类型用作键或值。

    11110

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

    要将一个对象添加到列表结尾,下面这样调用即可: cppResult.push_back(user); 在上一篇已经讲述了如何.NET对象转换给C++本地结构体,所以这个转换代码可以直接拿来用,综合起来...在C++端看来,SaveUsers方法的参数对象是一个集合,但是具体是什么对象并不知道,所以需要反射出集合的类型,同时还需要构建这样一个集合对象实例。...创建List实例 我们使用List来做集合对象,在C#,我们可以通过下面的方式得到List类型,然后进一步创建对象实例: Type t= typeof(List); 但是,对应的C+...; 但是IUserInfo 类型正是我们要动态反射的,事先并不知道,所以一时不知道在C++/CLI如何构建List的具体实例,MS你不能这么坑好么?...一切准备就绪,下面可以通过以下步骤提交集合数据给.NET方法了: 1,反射.NET方法,获取参数形参类型; 2,创建此形参的List对象实例; 3,遍历C++集合(列表list),将结构数据赋值给动态创建的实体类对象

    9.1K100

    趣谈

    Java 带来了什么好处?规约。就像接口定义一样,可以帮助对于类型和对象的使用上,保证类型的正确性。...擦除 Java 的在编译阶段实际上就已经被擦除了(这也是它和 C#最本质的区别),也就是说,对于使用的定义,对于编译执行的过程,并没有任何的帮助(有谁能告诉我为什么按着擦除来设计?)...T[] toArray(T[] a); } 事实上,这个方法 T 表示的是任意类型,它可是和此例的接口/类 E 毫不相干啊。...据我所知,Java1.5 引入的最大压力来自于没有的容器 API 相比起 C++的标准模板库来太难用,太多不必要的显式转型,完全违背了 DRY 原则也缺乏精细的类型检查。...但 Java 与 C++不同,C++的对象没有公共父类,不使用根本无法建立一个能存放所有类型的容器,所以必须在费大力气在编译后的运行代码中支持,保留信息自然是顺水推舟。

    23820

    C#编程-001:C#简介

    ,但是一个类可以实现多个接口 C#C++更加类型安全。...而布尔同整型,及枚举同整型不允许隐式转换,非空指针(通过引用相似对象)同用户定义类型的隐式转换必段被显式的确定,不同于C++的复制构造函数 数组声明语法不同("int[] a = new int[5...]" 而不是 "int a[5]") 枚举位于其所在的名字空间中 C#没有模版,但是在C# 2.0引入了,并且支持一些C++模版不支持的特性。...比如参数类型约束。...另一方面,表达式不能C++模版中被用于类型参数 属性支持,使用类似访问成员的方式调用 完整的反射支持 C# 2.0 新特性 在C# 2.0的新特性有: 局部类型(将类实现分在多个文件参数类型

    19610

    .NET面试题汇总

    3.当不知道方法具体实现什么时使用委托,如:事件中使用委托 3、什么是 概念:通过参数类型来实现在同一份代码上操作多种数据类型,利用“参数类型”将类型抽象化,从而实现灵活的复用。...优点:使用类型可以最大限度地重用代码、保护类型的安全以及提高性能。最常见的用途是创建集合类。...缺点:在性能上不如数组快 记:通过参数类型来实现在同一份代码上操作多种数据类型,使用类型可以最大限度地重用代码、保护类型的安全以及提高性能。...值类型:存放在堆栈,存储空间小,调用速度快,直接存储其值,System.ValueType中派生,内存自动释放,简单类型,枚举,结构; 引用类型:存放在堆,存储空间大,调用速度慢,存储对值的引用,...System.Object中派生,由GC自动释放,接口类型,数组类型,委托类型; 值类型的变量直接存储数据 引用类型的变量持有的是数据的引用,数据存储在数据堆 24、请详细描述C#的访问修饰符都有哪些

    1K31

    C#什么是

    参考视频 c#教程 集合与非集合最大的区别在于,集合,不需要进行装箱和拆箱的操作。...如集合元素为值类型,通常集合要优于非集合,并优于集合派生出来类型是广泛的意思,而是数据类型。这里的可以理解为应用广泛的数据类型。...诸如从集合添加和移除项这样的操作都以大体上相同的方式执行,与所存储数据的类型无关。 System.Collections —— 非集合类 System.Collections....Generic —— 集合类 集合 与非集合相比,使用集合有许多优点,如当集合元素为值类型时,则集合类型的性能会优于对应的非集合类型;并优于集合派生出来类型,为提高性能并获得类型安全...通过可以定义类型安全类,而不会损害类型安全、性能或工作效率。只须一次性将服务器实现为一般服务器,同时可以用任何类型来声明和使用它。需要使用来将一般类型参数括起来。

    48310

    C++模版的本质

    模板参数在形式上主要包括四类,为什么会存在这些分类,主要是满足不同类对参数化的需求: type template parameter: 类型模板参数,以class或typename 标记;此类主要是解决朴实的参数化类的问题...模板计算 模板参数支持两大类计算: 一类是类型计算(通过不同的模板参数返回不同的类型),此类计算为构建类型系统提供了基础,也是编程的基础; 一类是整型参数的算术运算, 此类计算提供了模板在实例化时候动态匹配模板的能力...Generic Programming(编程) 由于模板这种对类型强有力的抽象能力,能让容器和算法更加通用,这一系列的编程手法,慢慢引申出一种新的编程范式:编程。...编程是对类型的抽象接口进行编程,STL库就是编程经典范例。 ? C++模版的展望 1....模板的未来 随着模板生出来编程,模板元编程,模板函数式编程等理念的发展,将来也许会发展出更抽象,更通用编程理念。

    1.7K30

    C++篇】引领C++模板初体验:编程的力量与妙用

    模板编程是C++中非常重要的一个特性,通过模板可以实现编程,编写与数据类型无关的代码,极大地提高了代码的复用性和可维护性。...第一章: 初始模板与函数模版 1.1 什么是编程? 编程(Generic Programming)是C++的一种编程范式,旨在编写与数据类型无关的通用代码。...这意味着你可以编写一次代码,并通过不同的数据类型进行复用。C++通过模板(Template)来实现编程,模板编程的核心工具。 1.1.1 为什么要有编程?...在C++,类模板的实现与普通类有一个显著的区别:模板是在编译时根据实际类型实例化的,而不是普通的类那样在编译期和链接期处理。...这也是为什么大多数C++开发者在编写模板时会将模板的实现放在头文件的原因。

    18510

    C#详解

    数据类型的约束 程序员在编写类时,总是会对通用数据类型T进行有意或无意地有假想,也就是说这个T一般来说是不能适应所有类型,但怎样限制调用者传入的数据类型呢?...以上的类的约束表明,T必须是Stack和IComparable继承,V必须是Stack或Stack继承,否则将无法通过编译器的类型检查,编译失败。...通用类型T没有特指,但因为C#中所有的类都是object继承来,所以他在类Node的编写只能调用object类的方法,这给程序的编写造成了困难。...的静态构造函数 静态构造函数的规则:只能有一个,且不能参数,他只能被.NET运行时自动调用,而不能人工调用。...尽管 C# 的根基是 C++ 模板,但 C# 通过提供编译时安全和支持将提高到了一个新水平。C# 利用了两阶段编译、元数据以及诸如约束和一般方法之类的创新性的概念。

    1.2K60
    领券