为什么我不能使用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 
  • 后者将允许TValueType本身,这是一个引用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 。