C# 泛型C上的类型约束-多个约束
我有一个包含两组数据的类 X的值列表。 Y的值列表。 现在,X和Y可以以任何可能的组合保存字符串/双精度/整数/日期时间。唯一的规则是,在任何给定的时间点,两个列表必须包含相同数量的值 我可以通过仅通过AddXY方法和RemoveAt方法提供访问来解决始终保持相同数据的问题,确保在任何给定的时间点,我可以保证X列表和Y列表的大小相同 此外,我希望这个类的最终用户能够通过索引器访问X和Y值,如下所示 一些ClassInstance.X[i]和一些ClassInstance.Y[i] 因为在C中没有这个选项,所以我选择将X和Y作为IList AsReadOnly方法公开 现在,我考虑了使用泛型约束类型的想法。但我无法为这一特殊情况找到适当的例子 我怎么说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中没有
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进行约束。看起来您唯一的选择是不约束类型参数。您可能可以使用代码契约来强制执行规则。将其替换为代码契约并启用静态检查可能会奏效。都很有用!用一个代码契约替换它并打开静态检查可能会起作用。都很有用!