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

C#泛型和子类化-为什么我不能在ctor上给出类型参数?(简单)

C#泛型和子类化-为什么我不能在ctor上给出类型参数?

在C#中,泛型是一种强大的特性,它允许我们编写可以在多种类型上工作的通用代码。当我们定义一个泛型类或方法时,我们可以在使用时指定具体的类型参数。

然而,在子类化时,我们不能在构造函数(ctor)上给出类型参数。这是因为构造函数是用于创建对象实例的特殊方法,它在对象创建时被调用,用于初始化对象的状态。构造函数的目的是创建一个特定类型的对象,而不是一个泛型对象。

当我们子类化一个泛型类时,我们可以在子类中指定具体的类型参数,但不能在构造函数上指定。这是因为构造函数是用于创建子类对象的,而子类对象的类型已经在子类的定义中确定了。

例如,假设我们有一个泛型类MyGenericClass<T>,我们想要子类化它并在构造函数中指定类型参数。这是不允许的:

代码语言:txt
复制
class MySubClass : MyGenericClass<int> // 子类化并指定类型参数
{
    public MySubClass()
    {
        // 在构造函数中给出类型参数是不允许的
    }
}

相反,我们应该在子类的定义中指定类型参数,而不是在构造函数中指定。这样,我们就可以在子类中使用泛型类型的成员和方法。

代码语言:txt
复制
class MySubClass<T> : MyGenericClass<T> // 子类化并指定类型参数
{
    public MySubClass()
    {
        // 在构造函数中可以使用泛型类型的成员和方法
    }
}

总结一下,我们不能在构造函数上给出类型参数是因为构造函数是用于创建特定类型的对象,而不是泛型对象。在子类化时,应该在子类的定义中指定类型参数,而不是在构造函数中指定。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

1-

C#由CLR在运行时支持,这使得可以在CLR支持的各种语言无缝集合; C#代码在被编译[第一次编译]为IL代码元数据时[版的IL元数据], 采用特殊的占位符来表示类型,并用专有的...C#类型携带有丰富的元数据,因此C#类型可以应用于强大的反射技术;采用[基类, 接口, 构造器, 值类型/引用类型]的约束方式来实现对类型参数的"显式约束", 提高了类型的安全性。... .class public auto ansi beforefieldinit MyType`1<valuetype .ctor //注意这里加上了约束<[mscorlib...类型方法 可以用于类型有类、接口,结构、委托。 C#支持方法,但不支持除方法外的其他成员[属性、事件、索引器、构造器、析构器。...约束 为什么要有约束呢?

902100

C# 约束 new() 你必须要知道的事

C# 约束 new() 你必须要知道的事 注意:本文不会讲如何使用,关于的概念约束的使用请移步谷歌。 本文要讲的是关于约束无参构造函数 new 的一些底层细节注意事项。...不知道大家看到这里有没有觉得一丝惊讶,当时是有被惊到的,因为的第一想法就是觉得这么简单肯定是直接调用无参 .ctor,居然是用到的反射。毕竟编译器拥有在编译器就能识别具体的类了。...现在可以马后炮的讲:正因为是编译器只有在编译期才确定具体类型,所以编译器无法事先知道要直接调用哪些无参构造函数类,所以才用到了反射。...所以与此处的动态调用是冲突的。 的确没错,委托必须要在初始化表达式时就要确定类型。...这也是为什么花了很长时间弄清楚这个的原因。

1.6K60

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

类型擦除带来的缺陷 作为对比,我们再来简单聊下 C# 的实现方式。...C#实现方式为「具现化式(Reifiable generics)」,不熟悉的 C#小伙伴可以不用纠结具现化技术概念,也不了解这些特性--!...简单点来讲,C#实现的,无论是在程序源码,还是在编译之后的,甚至是运行期间都是切实存在的。 相对比与 C# ,Java 看起来就像是个「伪」。...所以当时 Java 给出一个简单粗暴的解决方案:既然没办法做到转换,那就索性不支持原始类型了。 如果需要使用,那就规定使用相关包装类的,比如 ArrayList。...那为什么 Java 采用 C# 的那种实现方式?或者说采用一种更好实现方式?

71910

理解C#运作原理

前言  我们都知道C#的重要性,是OOP语言中三大特征的多态的最重要的体现,几乎撑起了整个.NET框架,在讲之前,我们可以抛出一个问题,我们现在需要一个可扩容的数组类,且满足所有类型,...一.之前的故事  我们肯定会想到用object来作为类型参数,因为在C#中,所有类型都是基于Object类型的。...,实现的ArrayExpandableArrayExpandable性能都差于ArrayListList,还没实现IList各种方法,只能说句dotnet基金会牛逼 三.的多态性 多态的声明...outin之前,我们可以说下协变逆变,在C#中,只有接口委托可以支持协变逆变 协变 我们先看下代码: class FooBase{ } class Foo : FooBase {...,因此叫协变 在为接口用out标识其类型参数支持协变后,约束其方法的返回值属性的Get(本质也是个返回值的方法)才能引用所声明的类型参数,也就是作为输出值,用out很明显的突出了这一意思 而支持迭代的接口

68900

转向Kotlin——

无论是Java还是Kotlin,都是一个非常重要的概念,简单应用很容易理解,不过也有理解起来麻烦的时候。一起来认识一下。...Kotlin中 Kotlin并没有提供通配符,取而代之的是outin关键字。用out声明的占位符只能在获取类型值得地方,如函数的返回值。...用in声明的占位符只能在设置类型值的地方,如函数的参数。 我们习惯将只能读取的对象称为生产者,将只能设置的对象称为消费者。...如果我们的类能够仅仅只返回T类型的值,那么的确可以将其子类化。但如果在声明时未使用out声明T呢?...Array 对于类型参数T是不可变的,因此Array Array他们没有任何关系,为什么呢?

92420

C# new

C#中,new关键字有三种主要用法: new 运算符 (New Operator): 用于创建对象调用构造函数。这是new关键字最常见的用法,用于实例化类调用构造函数。...new 约束 (New Constraint): 用于在声明中,指定类型参数必须具有公共的无参数构造函数。这种用法确保了在类型参数被实例化时,会调用该类型的默认构造函数。...不知道大家看到这里有没有觉得一丝惊讶,当时是有被惊到的,因为的第一想法就是觉得这么简单肯定是直接调用无参 .ctor,居然是用到的反射。毕竟编译器拥有在编译器就能识别具体的类了。...现在可以马后炮的讲:正因为是编译器只有在编译期才确定具体类型,所以编译器无法事先知道要直接调用哪些无参构造函数类,所以才用到了反射。...试想一下 ,如果你的框架中有些方法用到了无参构造函数约束,并且处于调用的热路径,其实这样性能是大打折扣的,因为反射 Activator.CreateInstance 性能肯定是远远不如直接调用无参构造函数的

13820

十分钟教你理解TypeScript中的

你将在本文中学到什么 本文介绍TypeScript中(Generics)的概念用法,它为什么重要,及其使用场景。我们会以一些清晰的例子,介绍其语法,类型如何构建参数。...类似于参数的作用,是一种用以增强类(classes)、类型(types)接口(interfaces)能力的非常可靠的手段。这样,我们开发者,就可以轻松地将那些可复用的代码组件,适用于各种输入。...然而,不要把TypeScript中的错当成any类型来使用——你会在后面看到这两者的不同。 类似C#Java这种语言,在它们的工具箱里,是创建可复用代码组件的主要手段之一。...如果你更进一步,决定打印string的字符串——它会报运行时错误,但不指不出任何具体的内容,更重要的是,编译器没有给出任何类型匹配的编译时错误。  ...在TypeScript中使用的主要原因是使类型,类或接口充当参数。 它帮助我们为不同类型的输入重用相同的代码,因为类型本身可用作参数的一些好处有: 定义输入输出参数类型之间的关系。

2.2K10

C#反射与特性(三):反射类型的成员

一篇文章中,介绍如何获取 Type 类型,Type 类型是反射的基础。 本篇文章中,将使用 Type 去获取成员信息,通过打印出反射获取到的信息,为后续操作反射打好基础。...目录 1,获取类型的信息 1.1 类型的基类接口 1.1.1 基类 1.1.2 获取实现的接口 1.1.3 获取接口 1.2 获取属性、字段成员 1.2.1 构造函数 1.2.2 属性 1.2.3...外所有的类型 1.1 类型的基类接口 1.1.1 基类 C# 中,一个类型只能继承一个类型(基类型),使用实例的 Type.BaseType 属性,可以获取到此类型的基类型。...item in list) Console.WriteLine(item.Name); 输出 IDisposable IAsyncDisposable 1.1.3 获取接口...IEnumerable`1 IEnumerable IList ICollection IReadOnlyList`1 IReadOnlyCollection`1 注意的是,如果要通过名称获取接口 Type ,需要使用 类别的名称

1K40

在 .NET 中创建对象的几种方式的对比

在本文中,对比了常见的几种反射的方法,介绍了它们分别应该如何使用,每种的简易度灵活度,然后做了基准测试,一起看看这之间的性能差距。...; 第一步是通过 typeof() 获取对象的类型,你也可以通过 GetType 的方式,然后调用 GetConstructor 方法,传入 System.Type.EmptyTypes 参数,实际它是一个空数组...这是使用反射的最简单最灵活的方法之一,因为可以使用类似的方法来调用对象的方法、接口属性等,但是这个也是最慢的反射方法之一。..., 使用方法非常的简单,还可以使用,而且你还可以传入其他的参数。...我们现在有了方法签名,但是还没有方法体,还需要填充方法体,这里需要C#代码转换成 IL代码,实际它是这样的 IL_0000: newobj instance void Employee::.ctor(

2.1K30

类型形参与类型实参形参(parameter)实参(argument)的概念,比C#概念出现得还要早,其他一些语言使用形参实参已有数十年之久。...图2-1 函数形参与实参的关系 实参的值相当于方法形参的初始值,而涉及两个参数概念:类型形参(type parameter)类型实参(type argument),相当于把普通形参实参的思想用在了表示类型信息...比如前面提到C# 2中的接口IEnumerable,它.NET 1.0中的非接口IEnumerable就属于不同类型。...关于方法的调用,前文仅仅给出了关于类型实参的粗略描述。在调用方法时,有时无须在代码中给出类型实参,编译器可以帮我们决定具体采用哪个类型。...直接调用构造器的实现代码比较烦琐:new Tuple(10, "x", 20) 但是使用静态方法配合类型推断,代码就简单多了4:4前面说过构造器不能为,构造器中的参数实际是来自它所在类的类型形参

1.3K10

C# 7.3新特性一览

当方法组包含一些方法,而它们的类型参数不满足约束时,这些成员会被从候选集中移除。 对于方法组转换,那些返回类型与委托的返回类型不一致的候选方法会被从候选集中移除。...约束:枚举、委托非托管 自C# 2.0引入以来,开发人员就一直在抱怨,无法把一个类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为约束了。...尽管如此,这应该可以覆盖枚举委托的大多数使用场景。 非托管类型约束提案使用了unmanaged关键字,用于说明类型必须是“非引用类型,并且在任意嵌套层次都不包含引用类型字段。”...约束:枚举、委托非托管 自C# 2.0引入以来,开发人员就一直在抱怨,无法把一个类型指定为枚举。这个问题终于解决了,你现在可以使用enum关键字作为约束了。...尽管如此,这应该可以覆盖枚举委托的大多数使用场景。 非托管类型约束提案使用了unmanaged关键字,用于说明类型必须是“非引用类型,并且在任意嵌套层次都不包含引用类型字段。”

1.1K30

Kotlin 详解

最近一段时间在网上发了一套 Kotlin 的入门视频,涵盖了基础语法、面向对象、高阶函数、DSL、协程等比较有特色的知识点,不过有朋友提出了疑问:这门课为什么专门讲讲、反射注解呢?...真·伪· Java 的大家肯定都知道了,1.5 之后才加入的,可以为类方法分别定义参数,就像下面这样: public class Generics{    private T...fun getResult(): R{        ...    } } Java/Kotlin 的实现采用了类型擦除的方式,这与 C# 的实现不同,后者是真·,前者是伪·。...对于协变的类型,通常我们是不允许将类型作为传入参数类型的,或者说,对于协变类型,我们通常是不允许其涉及参数的部分被改变的。...* 不允许作为函数变量的类型参数! interface Foo class Bar : Foo // ERROR! * 不能直接作为父类的参数传入!

1.2K20

从C++转向Rust:两大主题值得关注!

这两种方案各有优劣,这里简单地说明一下。 返回值风格的优点是清晰,错误发生的位置处理方法都写得很直白;缺点即是拖沓,错误代码与业务代码交错在一起,使得主要逻辑突出。...只是因为避免语言过于繁冗,Rust允许开发在一些情况下省略该标记(Lifetime Elision); 因为BorrowChecker工作在编译期,所以生命周期标记合并在系统中,具体实现为参数中的一项...(三)子类化(Subtyping)与变型(Variance) 写下这个标题时,心里也是没有什么底的:因为相对来说这是一些抽象及陌生的概念,使用简单且易于理解的语言将其说明白,对来说是也很大的挑战。...在Rust中可以认为是enum或者struct的定义式; 可以是类型的实例化。如:Vec。 在考虑变型时,主要是第二种情形,即:类型的实例化。...我们可以将类型理解为类型的函数,因为其接收类型参数,返回新的类型

72730

背后的故事之 - 快乐的Lambda表达式(一)

只能说自从用了Lambda,腰也不酸了,腿也疼了,手指也不抽筋了,就连写代码bug都少了。小伙伴们,你们今天用Lambda了么?但是你真的了解它么?今天我们就来好好的认识一下吧。   ...来看看使用一个委托一共要以下几个步骤: 用delegate关键字创建一个委托,包括声明返回值参数类型 使用的地方接收这个委托 创建这个委托的实例并指定一个返回值参数类型匹配的方法传递过去   复杂吗...后来,幸运的是.NET 2.0为了们带来了。于是我们有了类,方法,更重要的是委托。...Action 没有输入参数返回值的委托 Action 可以接收1个到16个参数的无返回值委托 Func 可以接收0到16个参数并且有返回值的委托...原因很简单,我们告诉编译器,后面是个什么类型就可以了。

63270

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

从这点看Lambda明显要比匿名委托强大很多,最重要的是它还支持类型推断特性。 那么什么是类型推断?...类型推断的不足之处; 当然类型推断还存在不足的地方,这里可以顺便参见一下我们老赵大哥的一篇文章:“C#编译器对方法调用作类型推断的奇怪问题”;在实际工作中也遇到过一个很头疼问题,这里顺便跟大家分享一下...按照常理说方法的形参里面定义一个的委托,他们的形参类型都是一样的占位符,但是如果使用带有形参的方法作为委托的参数的话是无法进行类型推断的,然后使用无参数的方法作为委托参数是完全没有问题的。...其实这里的Func中的TResult已经是方法的返回类型,TSource也是方法的参数类型,按道理是完全可以进行类型推断的。可是尝试了很多种方式就是过起。...如果不是为什么多了参数就无法进行类型推断?

1.9K31

ILRuntime学习

(__esp, 1); //这里是将栈指针的值转换成object,如果是基础类型可直接通过ptr->Valueptr->ValueLow访问到值,具体请看ILRuntime实现原理文档...可以选择性的对经常使用的CLR接口进行直接调用,从而尽可能的消除反射调用开销以及额外的GC Alloc CLR绑定会生成较多C#代码,最终会增大包体Native Code的内存耗用,所以只添加常用类型频繁调用的接口即可...__intp.Free(ptr); var genericArgument = __method.GenericArguments; //AddComponent应该有且只有1个参数...__intp.Free(ptr); var genericArgument = __method.GenericArguments; //AddComponent应该有且只有1个参数...Debug.LogFormat("刚刚的方法执行了:{0} ms", sw.ElapsedMilliseconds); unity脚本代码性能(unity=》window=》profiler 不知道为什么没有这个选项

1.1K30

除了参数,ref关键字还可以用在什么地方?

《老生常谈:值类型 V.S. 引用类型》中花了很大的篇幅介绍ref参数针对值类型引用类型变量的传递。...在C#中,除了方法的ref参数,我们还有很多使用ref关键字传递引用/地址的场景,本篇文章作一个简单的总结。...不能作为参数 除非我们能够显式将参数约束为ref结构体,对应的方法严格按照ref结构的标准来操作对应的参数或者变量,我们才能够能够将ref结构体作为参数。...否则对于结构体,涉及的方法肯定会将其当成一个常规结构体看待,若将ref结构体指定为参数类型自然是有问题。...但是针对ref结构体的约束目前还没有,所以我们就不能将ref结构体作为参数,所以按照如下的方式创建一个Wrapper(Foobar为上面定义的ref结构体,下面不再单独说明)的代码是不能编译的

16920

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

前言   并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能。基于,我们得以将类型参数化,以便更大范围地进行代码复用。同时,它减少了类及方法中的转型,确保了类型安全。...这里也有一篇之前简单理解篇 http://www.cnblogs.com/aehyok/p/3384637.html C# 简单理解(安全、集合、方法、约束、继承) 本文已更新至http...、类型安全高效率等特性,这都是非方法无法具备的。...实际,随着你为T指定不同的数据类型,MyList相应的也变成了不同的数据类型,在它们之间是共享静态成员的。...t1或参数t2仅仅具有object的属性行为,所以几乎不能在方法中对它们做任何的操作。

60620

C#中的

C#中的 2008-12-17 作者: 张阳 分类: C# 语言 .Net 1.1版本最受诟病的一个缺陷就是没有提供对的支持。...为什么要有想不论大家通过什么方式进入了计算机程序设计这个行业,都免不了要面对数据结构算法这个话题。...类型参数约束 实际,如果你运行一下上面的代码就会发现它连编译都通过不了,为什么呢?...为了解决这个问题,我们自然而然地会想到:有没有办法把类型参数T加到方法,而非整个类,也就是降低T作用的范围。答案是可以的,这便是本小节的主题:方法。...总结 本节中我们学习了掌握所需要的最基本知识,你看到了需要的原因,它可以避免重复代码,还学习到了如何使用类型参数约束方法。拥有了本节的知识,你足以应付日常开发中的大部分场景。

1.2K70
领券