为什么我不能使用System.ValueType作为generics约束?
- 为什么我不能使用
where T : System.ValueType
的约束? - 为什么微软会阻止这种types的约束?
例:
为什么我不能做到以下几点?
// Defined in a .Net class public void bar<T>(T a) where T : ValueType {...} // Defined in my class public void foo<T>(T a) where T : ValueType { bar<T>(a); }
在ValueType上使用struct有什么区别?
// Defined in my class public void foo<T>(T a) where T : struct { bar<T>(a); }
使用有两个区别
where T : struct
和
where T : ValueType
- 后者将允许
T
是ValueType
本身,这是一个引用types。 - 后者也将允许
T
是一个可为空值的types
这些差异中的第一个几乎不是你想要的。 第二个可能偶尔有用; Nullable<T>
有点奇怪,它既不满足where T : struct
也不满足where T : class
约束。
更有用的是约束
where T : struct, System.Enum
这是由C#禁止的,没有什么好的理由,我可以告诉。 看到我的博客文章和无约束的旋律项目了解更多。
ValueType不是值types的基类,它只是装箱时的值的容器。 由于它是一个容器类,而不是任何你想要使用的实际types的层次结构,所以它作为一个通用的约束是没有用的。
使用struct
作为通用约束在function上等同于“ValueType”约束。 在.NET中, 结构是一个值types 。