gpt4 book ai didi

c# - 为什么这些是 "Special Classes"?

转载 作者:可可西里 更新时间:2023-11-01 07:58:13 25 4
gpt4 key购买 nike

看完this question问“特殊类”到底是什么,我剩下的问题是为什么这六个类 System.ObjectSystem.ArraySystem.DelegateSystem.EnumSystem.ValueType 被选中并且 hard-coded作为特殊类,防止它们被用作泛型类或方法的约束。

很容易理解为什么 System.Object 在那里;所有类都继承 System.Object,因此无需将其作为约束包含在内。我不清楚的是,为什么其他人被选为这个特殊类(class)类别的一部分。

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()通用约束都是关于接口(interface)的继承或实现(在许多方面类似于继承)。事实上,其他限制是不能使用指针类型,也不能使用密封类型;无论如何都不能拥有派生类型的两种情况(尽管禁止密封类型主要是因为您可能在不需要时创建泛型类型或方法,并且试图保护您免受自己的伤害) .

因此,当遇到有关继承的特殊情况时,基于继承功能(如约束)的代码本身可能不得不涉及特殊情况。这些特殊情况以最简单的方式处理:禁止它们。

在许多情况下,值(value)也较低:

System.Object : 因为只有类型不能转换为 System.Object是指针类型,无论如何这些都不能用作泛型参数,任何此类约束都是多余的。

System.Array : 您可以根据元素类型定义:void DoSomethingWithArray<T>(T[] array)

System.Delegate : 这会很有用,虽然在许多情况下我们可以根据参数和/或返回类型来定义,但有些情况下这并没有捕捉到。

System.Enum : 会很有用。

System.ValueType : 已经处理;约束为 struct .反过来我们也可以约束为class排除这种情况,所以我们实际上有一个“不是继承自……”的选项,否则我们没有。

这并不是否认能够根据 Delegate 进行约束, MulticastDelegateEnum不会有用(可能最多所以我们 Enum ),但在证明覆盖这些类型的额外工作的合理性方面,其他人几乎没有或根本没有好处,因此减少限制的好处减少了。

关于c# - 为什么这些是 "Special Classes"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30072259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com