泛型集合中的泛型类型

时间:2010-04-01 14:03:30

标签: c# .net generics

我的通用类型如下:

public class GenericClass<T, U> where T : IComparable<T>
{
    // Class definition here
}

然后我有这些实例的集合。通过类型约束的最简洁方法是什么?

public class GenericCollection<V> where V : GenericClass<T, U> // This won't compile
{
    private GenericClass<T, U>[] entries;

    public V this[index]
    {
        get{ return this.entries[index]; }
    }
}

是否有更好的方法来设计它?我认为指定

GenericCollection<T, U, V> where V : GenericClass<T, U> 

看起来很尴尬。可能是我唯一的选择......

5 个答案:

答案 0 :(得分:6)

创建泛型类时,泛型类的所有成员中使用的所有对象的所有泛型类型参数必须在编译时可解析。

您可以拥有特定其他泛型类型实例的类型参数 - 例如:

public class GenericCollection<T> where T : GenericClass<int, string> { ... }

但是如果你希望GenericClass的类型参数本身是通用的,那么所有这些类型都需要成为类声明的一部分,正如你所写:

GenericCollection<T, U, V> where V : GenericClass<T, U> 

很抱歉,如果它看起来很尴尬,但这是你唯一的选择。

答案 1 :(得分:2)

我认为该集合需要与GenericClass相同的约束:

public class GenericCollection<T, U> where T : IComparable<T>
{
    private GenericClass<T, U>[] entries;
}

答案 2 :(得分:1)

我认为你的解决方案是

public class GenericClass<T, U> where T : IComparable<T>
{
     // Class definition here
}

public class GenericCollection<T,U>  where T : IComparable<T>
{
     private GenericClass<T, U>[] entries;
     public GenericClass<T, U> this[int index]
      {
         get{ return this.entries[index]; }
      }
}

答案 3 :(得分:1)

我认为这是你真正想要的......

    class g<t, u> where t : IComparable<t>
{
}

class gc<t, u>
{
    private g<t, u>[] entries;

    public g<t, u> this[int index]
    {
        get { return this.entries[index]; }
    }
}

答案 4 :(得分:0)

你还没有把它宣布为班级!

public class GenericCollection<V>