在泛型C#上键入约束 - 多个约束

时间:2012-11-28 07:04:18

标签: c# generics type-constraints

我有一个包含两组数据的类。

  1. X的值列表。
  2. Y的值列表。
  3. 现在,X和Y可以在任何可能的组合中保存字符串/ double / integer / datetime。唯一的规则是,在任何给定的时间点,两个列表必须包含相同数量的值。

    我可以通过仅通过AddXY方法和RemoveAt方法提供访问来解决始终保持相等数据的问题(确保在任何给定的时间点,我可以保证X列表和Y列表的大小相同)

    此外,我希望此类的最终用户能够通过索引器访问X和Y值,如下所示。

    someClassInstance.X [i]和someClassInstance.Y [i]

    因为在C#中没有这个选项,我选择将X和Y作为IList(AsReadOnly)方法公开。

    现在,我考虑过使用泛型来约束类型的想法。但是我无法找到适合这个特例的适当例子。

    怎么说

    public class MyClass<P, Q> 
         where P : Double, String, Integer, DateTime 
         and Q : Double, String, Integer, DateTime
    

    我是否应该完全抛弃这个想法并查看某种元组或某种数据结构?

    编辑:我也知道约束不能是值类型,所以这是如何工作的?

1 个答案:

答案 0 :(得分:4)

您在C#中无法提出的问题。没有统一这些类型的泛型类型约束。

您可以做的最好是在运行时检查,例如在静态构造函数中。像这样:

public class MyClass<P, Q>
{
    static MyClass() 
    {
       if (IsValidType(typeof(P) 
           && IsValidType(typeof(Q))
       throw new NotSupportedException("invalid type for MyDataStructure");
    }
    static bool IsValidType(Type type)
    {
       // logic to check whether type is acceptable
       return true;
    }
}

但是我建议不要这样做,因为它似乎有点人为。