【发布时间】:2015-04-30 07:40:43
【问题描述】:
在编译失败后:
public class Gen<T> where T : System.Array
{
}
有错误
约束不能是特殊类`System.Array'
我开始想,究竟什么是“特殊班级”?
当人们在通用约束中指定System.Enum 时,他们似乎经常遇到相同类型的错误。 System.Object、System.Delegate、System.MulticastDelegate 和 System.ValueType 也得到了相同的结果。
还有更多吗?我在 C# 中找不到有关“特殊课程”的任何信息。
另外,这些类有什么特别之处,以至于我们不能将它们用作泛型类型约束?
【问题讨论】:
-
我不认为这是直接复制。问题不是“为什么我不能将其用作约束”,而是“这些特殊类是什么”。我看过这些问题,它们只是说明了为什么将其用作约束是无用的,而不是解释“特殊类”实际上是什么以及为什么它被认为是特殊的。
-
根据我的经验,使用但不能直接使用它们,只能通过其他语法隐式使用的类是特殊类。枚举属于同一类别。究竟是什么让它们特别,我不知道。
-
@AndyKorneyev:这个问题有点不同。我要求定义“特殊类别”和/或这些的综合列表。这个问题只是询问 System.Array 不能成为泛型类型约束的原因。
-
documentation 声明“[...]只有系统和编译器可以从 Array 类显式派生。”。很可能这就是它成为一个特殊类的原因——编译器会对其进行特殊处理。
-
@RB.:错误。这个逻辑意味着
System.Object不是一个“特殊类”,因为这是有效的:public class X : System.Object { },但System.Object仍然是一个“特殊类”。
标签: c# class generics generic-constraints