2014-02-07 34 views
4

我想创建以下类片段在C#泛型泛型类型参数,允许以某种形式

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

是这种模式一般可以在C#中?在目前的形式下,编译器不喜欢它。你似乎无法约束一个类型参数是一个通用的。然而,它看起来像是一个合理的事情要做。有什么窍门可以实现它吗?

注意:这个问题是关于泛型和类型约束的具体问题。它不是在寻找我认为可能在我的更广泛应用中尝试做的工作。

+0

没有可能的工作。你会限制TCollection是两个不同的非泛型类型。无论如何,我都会尝试它;) – bradgonesurfing

+2

你能提供你想要如何使用它的样本吗? – Grundy

+0

为什么你想要TCollection是通用的?有两个ICollections作为字段是不够的吗? – Marcel

回答

3

您不能将一个通用类型参数约束为开放泛型类型,这似乎是您如何尝试在课程的其余部分使用它。

您要求提供规范参考,并且没有一个地方似乎以一种很好,简洁的方式进行拼写。

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

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

但在您的尝试中,TCollection将不会与此文本匹配,因为它要求非关闭类型。

+2

也许从4.4.3开始也是有用的:“唯一可以引用非绑定泛型类型的构造是'typeof'表达式(第7.6.11节)。” –

3

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

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

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

+0

实际上,这是我的真实代码中的工作,除了它是“通用”。 TKeyCollection和TValueCollection可以从不同的基地继承。其中一个可能是List ,另一个可能是HashSet ,它有点过于宽泛。 – bradgonesurfing

+0

理论上你可以通过添加另一个类型参数来约束'TKeyCollection'和'TValueCollection'的基数来缩小它。您只需使用非通用接口(例如'IList'或'ICollection')。你将无法确定确切的类型。 –