假设我有一个系列
public class TimeSeries<T,K>
我想构建一个具有列表成员的类,该成员可以将TimeSeries
存储为元素,所以我使用:
public class TimeSeriesSet<M> where M: TimeSeries<T, K>
我想知道那个正确的语法是什么?
答案 0 :(得分:5)
您可以这样做:
public class TimeSeriesSet<T, K>
{
public TimeSeries<T, K> SomeField;
}
根本不需要使用约束。如果你实际上不打算使用它们,请不要使用泛型类型参数;)
你想要添加另一个类型参数的唯一原因是你想要一些TimeSeries<T, K>
的显式后代。在这种情况下,只需将其添加为另一个类型参数:
public class TimeSeriesSet<M, T, K>
where M: TimeSeries<T, K>
{
public M SomeField;
}
一般来说,通用性往往会传播。如果你需要泛型通用的东西,你需要两个泛型类型的参数。值得庆幸的是,类型推断通常有效。一般
答案 1 :(得分:1)
Luaan的回答涵盖了构建代码的两种方法。但是,您可以使用一种变体。看起来TimeSeriesSet是名称和类型参数都与TimeSeries耦合的一种方式。我想知道是否可能,以下其中一项在您的应用程序中没有任何意义:
没有后代约束:
public class TimeSeries<T, K>
{
public class Set
{
public TimeSeries<T, K> SomeField;
}
}
或使用后代约束:
public class TimeSeries<T, K>
{
public class Set<M> where M : TimeSeries<T, K>
{
public M SomeField;
}
}
这具有额外的优势:通过使TimeSeriesSet<T, K, M>
干扰TimeSeries<T, K>
依赖于TimeSeries<T, K>.Set<M>
及其类型参数的类型参数声明和更清晰的模型。