通用接口的通用列表不允许,任何替代方法?

时间:2010-12-23 21:23:03

标签: c# generics interface generic-list

我试图找到使用通用接口通用列表作为变量的正确方法。

这是一个例子。它可能不是最好的,但希望你能明白这一点:

public interface IPrimitive<T>
{
     T Value { get; }
}

然后在另一个类中,我希望能够声明一个变量,该变量包含对任意IPrimitive<T>实现T的对象列表。

// I know this line will not compile because I do not define T   
List<IPrimitive<T>> primitives = new List<IPrimitives<T>>;

primitives.Add(new Star());   // Assuming Star implements IPrimitive<X>
primitives.Add(new Sun());    // Assuming Sun implements IPrimitive<Y>

请注意,T中的IPrimitive<T>对于列表中的每个条目可能会有所不同。

关于如何建立这种关系的任何想法?替代方法?

3 个答案:

答案 0 :(得分:24)

public interface IPrimitive
{

}

public interface IPrimitive<T> : IPrimitive
{
     T Value { get; }
}

public class Star : IPrimitive<T> //must declare T here
{

}

然后你应该能够拥有

List<IPrimitive> primitives = new List<IPrimitive>;

primitives.Add(new Star());   // Assuming Star implements IPrimitive
primitives.Add(new Sun());    // Assuming Sun implements IPrimitive

答案 1 :(得分:10)

John is correct.

我是否也建议(如果您使用的是C#4)使界面协变?

public interface IPrimitive<out T>
{
     T Value { get; }
}

如果您需要从列表中删除内容,这可以为您节省一些麻烦。

答案 2 :(得分:4)

你说它不起作用,因为你没有定义T。所以定义它:

public class Holder<T>
{
    public List<IPrimitive<T>> Primitives {get;set;}
}