首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >不允许通用接口的通用列表,是否有替代方法?

不允许通用接口的通用列表,是否有替代方法?
EN

Stack Overflow用户
提问于 2010-12-24 05:23:03
回答 3查看 11.7K关注 0票数 25

我正在尝试找到将泛型接口的泛型列表用作变量的正确方法。

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

代码语言:javascript
复制
public interface IPrimitive<T>
{
     T Value { get; }
}

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

代码语言:javascript
复制
// 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>

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

关于如何建立这样的关系有什么想法吗?另一种方法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-24 05:28:59

代码语言:javascript
复制
public interface IPrimitive
{

}

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

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

}

那么你应该能够拥有

代码语言:javascript
复制
List<IPrimitive> primitives = new List<IPrimitive>;

primitives.Add(new Star());   // Assuming Star implements IPrimitive
primitives.Add(new Sun());    // Assuming Sun implements IPrimitive
票数 29
EN

Stack Overflow用户

发布于 2010-12-24 05:29:03

John is correct.

我还可以建议(如果您使用的是C# 4)使您的界面协变吗?

代码语言:javascript
复制
public interface IPrimitive<out T>
{
     T Value { get; }
}

当你需要从列表中取出一些东西时,这可以为你省去一些麻烦。

票数 11
EN

Stack Overflow用户

发布于 2010-12-24 05:27:15

你说它不会工作,因为你没有定义T。所以给它下定义:

代码语言:javascript
复制
public class Holder<T>
{
    public List<IPrimitive<T>> Primitives {get;set;}
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4522580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档