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

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

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

public interface IPrimitive { T Value { get; } } 

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

 // I know this line will not compile because I do not define T List<IPrimitive> primitives = new List<IPrimitives>; primitives.Add(new Star()); // Assuming Star implements IPrimitive primitives.Add(new Sun()); // Assuming Sun implements IPrimitive 

请注意,对于列表中的每个条目, IPrimitive可能不同。

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

 public interface IPrimitive { } public interface IPrimitive : IPrimitive { T Value { get; } } public class Star : IPrimitive //must declare T here { } 

然后你应该能够拥有

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

约翰是对的。

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

 public interface IPrimitive { T Value { get; } } 

当您需要从列表中取出内容时,这可以为您节省一些麻烦。

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

 public class Holder { public List> Primitives {get;set;} }