C# 泛型C上的类型约束-多个约束

C# 泛型C上的类型约束-多个约束,c#,generics,type-constraints,C#,Generics,Type Constraints,我有一个包含两组数据的类 X的值列表。 Y的值列表。 现在,X和Y可以以任何可能的组合保存字符串/双精度/整数/日期时间。唯一的规则是,在任何给定的时间点,两个列表必须包含相同数量的值 我可以通过仅通过AddXY方法和RemoveAt方法提供访问来解决始终保持相同数据的问题,确保在任何给定的时间点,我可以保证X列表和Y列表的大小相同 此外,我希望这个类的最终用户能够通过索引器访问X和Y值,如下所示 一些ClassInstance.X[i]和一些ClassInstance.Y[i] 因为在C中没有

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

X的值列表。 Y的值列表。 现在,X和Y可以以任何可能的组合保存字符串/双精度/整数/日期时间。唯一的规则是,在任何给定的时间点,两个列表必须包含相同数量的值

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

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

一些ClassInstance.X[i]和一些ClassInstance.Y[i]

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

现在,我考虑了使用泛型约束类型的想法。但我无法为这一特殊情况找到适当的例子

我怎么说

public class MyClass<P, Q> 
     where P : Double, String, Integer, DateTime 
     and Q : Double, String, Integer, DateTime
我是否应该完全放弃这个想法,看看某种元组或类似的数据结构


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

在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;
    }
}

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

在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;
    }
}

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

问题是我不想为不同的组合创建多个类。为什么不使用struct作为约束?对集合项使用kvp与自定义集合或元组有何不同?我并不是说元组更好。你说得对,就我希望实现的目标而言,没有什么不同在再次查看示例之后,我明白了为什么您需要对struct进行约束。看起来您唯一的选择是不约束类型参数。您可能可以使用代码契约来强制执行规则。问题是我不想为不同的组合创建多个类。为什么不使用struct作为约束?对集合项使用kvp与自定义集合或元组有何不同?我并不是说元组更好。你说得对,就我希望实现的目标而言,没有什么不同在再次查看示例之后,我明白了为什么您需要对struct进行约束。看起来您唯一的选择是不约束类型参数。您可能可以使用代码契约来强制执行规则。将其替换为代码契约并启用静态检查可能会奏效。都很有用!用一个代码契约替换它并打开静态检查可能会起作用。都很有用!