Ale*_*fie 14 c# generics generic-constraints
看完这个问题问完全是"特级"是的,我剩下什么问题,为什么六班System.Object,System.Array,System.Delegate,System.Enum和System.ValueType被选择和硬编码的特殊班,防止它们被用来作为约束泛型类或方法.
很容易理解为什么System.Object在那里; 所有类都继承,System.Object因此不需要将其作为约束包含在内.我不清楚的是为什么其他人被选为这个特殊班级的一部分.
PS:特殊类在尝试将它们用作约束时引发编译错误CS0702.
在将通用约束或甚至泛型添加到.NET框架并将其添加到C#语言的支持之前,这些类已经不同了.
每个人的共同点是,从他们那里继承的不同于其他类型:
System.Object:你无法不从这个在C#中继承.
System.Array:您通过创建现有类型的数组(Array x = new int[2];等)继承此
System.Delegate:你通过创建一个delegate(然后派生自MulticastDelegate,也是一个派生自的"特殊类型" Delegate)来继承.
System.Enum:你通过创建一个继承enum.
System.ValueType:你通过创建一个继承struct.
现在,请注意,除了new()泛型约束之外,还有关于接口的继承或实现(在很多方面类似于继承).实际上,其他限制是您不能使用指针类型,并且您不能使用密封类型; 两种情况下你无法获得派生类型(尽管禁止密封类型主要是因为你可能在你不需要时创建一个通用类型或方法,并试图保护你自己) .
因此,当面对有关继承的特殊情况时,基于继承功能(作为约束)的代码本身可能必须涉及特殊情况.这些特殊情况以最简单的方式处理:禁止它们.
在许多情况下,该值也较少:
System.Object:由于唯一无法转换为System.Object的类型是指针类型,并且这些类型无论如何都不能用作通用参数,因此任何此类约束都是多余的.
System.Array:您可以根据元素类型定义:void DoSomethingWithArray<T>(T[] array)等.
System.Delegate:这样会很有用,尽管在很多情况下我们可以根据参数和/或返回类型进行定义,但是有些情况并没有发现.
System.Enum:会很有用.
System.ValueType:已经处理过; 约束为struct.相反,我们也可以限制class排除这种情况,所以我们实际上是一个"不继承自......"的选项,否则我们没有.
这并不是否认,能够在以下方面来约束Delegate,MulticastDelegate或者Enum是没有用的(可能是最让我们Enum),但在证明额外的工作,以支付这些类型别人想给你很少或没有好处而言,这样的好处限制较少的限制.
| 归档时间: |
|
| 查看次数: |
333 次 |
| 最近记录: |