使用“where”关键字将通用候选者限制为一个类,这也是一个通用的

时间:2015-08-10 15:41:38

标签: c# generics

假设我有一个系列

public class TimeSeries<T,K>

我想构建一个具有列表成员的类,该成员可以将TimeSeries存储为元素,所以我使用:

public class TimeSeriesSet<M> where M: TimeSeries<T, K>

我想知道那个正确的语法是什么?

2 个答案:

答案 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>及其类型参数的类型参数声明和更清晰的模型。