限制泛型类型

时间:2010-03-28 19:55:32

标签: c# generics

我想将泛型类型参数限制为:

1)某个用户定义的引用类型;

OR

2)CLR中的任何原始类型;

我怎么说一下效果:

interface IDataManager<T>: IDataManager
    where T: IDataObject, T: ValueType

3 个答案:

答案 0 :(得分:1)

来自Constraint cannot be special class 'System.Enum'

  

更多调查显示C#2.0   规格如下   关于限制的评论:

     

类类型约束必须满足   以下规则:

     
      
  • 类型必须是类类型。
  •   
  • 不得密封该类型。
  •   
  • 类型不能是以下类型之一:System.Array,
      System.Delegate,System.Enum或
      System.ValueType。
  •   
  • 类型不能是对象。因为所有类型都来自   对象,这样的约束会   没有效果,如果是的话   允许的。
  •   
  • 给定类型参数的最多一个约束可以是类类型。
  •   

另外Compiler Error CS0702

并在

提及

Jon Skeet: Coding Blog : Generic constraints for enums and delegates

答案 1 :(得分:1)

您可以使用的限制不会限制您使用内置基元。我要做的是为每个原语重载方法,并且可能让每个重载只是将它的参数传递给保存公共代码的私有泛型方法。

答案 2 :(得分:1)

T: ValueType 

您最接近的是T : struct,但这并不仅限于CLR类型。无论哪种方式,我都不相信有一种方法可以使用OR泛型约束。对于特定类型,您可以使用一个通用方法和n次重载。

例如,您也不能定义多个仅在其约束条件上有所不同的通用函数。约束不是签名的一部分。请参阅:http://blogs.msdn.com/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx