为什么这些 "Special Classes"?
Why exactly are these "Special Classes"?
在将 asking what exactly a “Special Class” is, I am left with the question why the six classes System.Object
, System.Array
, System.Delegate
, System.Enum
and System.ValueType
were chosen and hard-coded 读取为特殊 类 后,防止它们被用作通用 类 或方法的约束。
很容易理解为什么System.Object
在那里; all 类 inherit System.Object
所以没有必要把它作为一个约束。我不清楚的是 为什么 其他人被选为这个特殊 类 类别的一部分。
PS:特殊 类 在尝试将它们用作约束时引发编译错误 CS0702。
在将泛型约束甚至泛型添加到 .NET 框架并将对它们的支持添加到 C# 语言之前,这些 类 已经不同了。
他们每个人的共同点是,从他们那里继承与其他类型不同:
System.Object
:你不能不在C#中继承它。
System.Array
: 您通过创建现有类型的数组(Array x = new int[2];
等)继承自此
System.Delegate
: 您通过创建一个 delegate
(然后从 MulticastDelegate
派生,也是一个 "special type", 派生自 Delegate
).
System.Enum
: 你通过创建一个 enum
.
来继承它
System.ValueType
: 你通过创建一个 struct
.
来继承
现在,请注意,除了 new()
之外,通用约束都是关于接口的继承或实现(在许多方面类似于继承)。事实上,其他限制是不能使用指针类型,也不能使用密封类型;无论如何都不能拥有派生类型的两种情况(尽管禁止密封类型主要是因为您可能在不需要时创建泛型类型或方法,并且试图保护您免受自己的伤害) .
因此,当遇到有关继承的特殊情况时,基于继承功能(如约束)的此类代码本身可能不得不涉及特殊情况。这些特殊情况以最简单的方式处理:禁止它们。
在许多情况下,该值也较低:
System.Object
: 由于唯一不能转换为 System.Object
的类型是指针类型,并且这些不能用作泛型参数无论如何,任何这样的约束都是多余的。
System.Array
: 可以根据元素类型定义:void DoSomethingWithArray<T>(T[] array)
等
System.Delegate
:这样会有用,虽然很多时候我们可以根据参数定义and/orreturn类型,但是有些情况这没有捕捉到。
System.Enum
: 会很有用。
System.ValueType
: 已经处理;约束为 struct
。相反,我们也可以限制为 class
以排除这种情况,因此我们实际上有一个 "not inherited from…" 选项,否则我们没有。
这并不是否认能够根据 Delegate
、MulticastDelegate
或 Enum
进行约束是没有用的(可能大多数情况下我们 Enum
) , 但就证明覆盖这些类型的额外工作而言,其他人几乎没有或根本没有好处,因此减少限制的好处减少了。
在将 System.Object
, System.Array
, System.Delegate
, System.Enum
and System.ValueType
were chosen and hard-coded 读取为特殊 类 后,防止它们被用作通用 类 或方法的约束。
很容易理解为什么System.Object
在那里; all 类 inherit System.Object
所以没有必要把它作为一个约束。我不清楚的是 为什么 其他人被选为这个特殊 类 类别的一部分。
PS:特殊 类 在尝试将它们用作约束时引发编译错误 CS0702。
在将泛型约束甚至泛型添加到 .NET 框架并将对它们的支持添加到 C# 语言之前,这些 类 已经不同了。
他们每个人的共同点是,从他们那里继承与其他类型不同:
System.Object
:你不能不在C#中继承它。
System.Array
: 您通过创建现有类型的数组(Array x = new int[2];
等)继承自此
System.Delegate
: 您通过创建一个 delegate
(然后从 MulticastDelegate
派生,也是一个 "special type", 派生自 Delegate
).
System.Enum
: 你通过创建一个 enum
.
System.ValueType
: 你通过创建一个 struct
.
现在,请注意,除了 new()
之外,通用约束都是关于接口的继承或实现(在许多方面类似于继承)。事实上,其他限制是不能使用指针类型,也不能使用密封类型;无论如何都不能拥有派生类型的两种情况(尽管禁止密封类型主要是因为您可能在不需要时创建泛型类型或方法,并且试图保护您免受自己的伤害) .
因此,当遇到有关继承的特殊情况时,基于继承功能(如约束)的此类代码本身可能不得不涉及特殊情况。这些特殊情况以最简单的方式处理:禁止它们。
在许多情况下,该值也较低:
System.Object
: 由于唯一不能转换为 System.Object
的类型是指针类型,并且这些不能用作泛型参数无论如何,任何这样的约束都是多余的。
System.Array
: 可以根据元素类型定义:void DoSomethingWithArray<T>(T[] array)
等
System.Delegate
:这样会有用,虽然很多时候我们可以根据参数定义and/orreturn类型,但是有些情况这没有捕捉到。
System.Enum
: 会很有用。
System.ValueType
: 已经处理;约束为 struct
。相反,我们也可以限制为 class
以排除这种情况,因此我们实际上有一个 "not inherited from…" 选项,否则我们没有。
这并不是否认能够根据 Delegate
、MulticastDelegate
或 Enum
进行约束是没有用的(可能大多数情况下我们 Enum
) , 但就证明覆盖这些类型的额外工作而言,其他人几乎没有或根本没有好处,因此减少限制的好处减少了。