是否允许以某种形式在C#中使用通用通用类型参数

时间:2014-02-07 08:18:47

标签: c# .net generics

我想创建以下类片段

class Lookup<TKey,TValue,TCollection>
where TCollection : ICollection<>
{
    public TCollection<TKey> _KeyCollection;
    public TCollection<TValue> _ValueCollection;
}

这种模式一般可以在C#中使用吗?在当前形式中,编译器不喜欢它。您似乎无法将类型参数约束为泛型。然而,想要这样做似乎是合理的。有什么技巧可以实现吗?

注意:此问题专门针对泛型和类型约束。它并不是在寻找一种解决方案,因为您认为我可能会在更广泛的应用程序中尝试这样做。

2 个答案:

答案 0 :(得分:3)

您不能将泛型类型参数约束为 open 泛型类型,这似乎就是您尝试在其余类中使用它的方式。

你问了一个规范参考,并没有一个地方似乎以一种漂亮,简洁的方式拼出来。

我能找到的最好的是4.5节(来自C#5.0规范):

  

作为类型,类型参数纯粹是编译时构造。在运行时,每个类型参数都绑定到通过向泛型类型声明提供类型参数指定的运行时类型。因此,使用类型参数声明的变量类型在运行时将是闭合构造类型(第4.4.2节)。涉及类型参数的所有语句和表达式的运行时执行使用作为该参数的类型参数提供的实际类型。

但是在您的尝试中,TCollection将无法与此文本匹配,因为它要求的是非封闭类型。

答案 1 :(得分:3)

您不能将开放泛型类型作为约束。但是,您可以使用封闭的泛型类型:

class Lookup<TKey, TValue, TKeyCollection, TValueCollection>
    where TKeyCollection : ICollection<TKey>
    where TValueCollection : ICollection<TValue>
{
    public TKeyCollection _KeyCollection;
    public TValueCollection _ValueCollection;
}

它可能不漂亮,并且有很多类型参数,但它是可能的。