gpt4 book ai didi

c# - 在 C# 中将子类型列表作为父类(super class)型列表返回

转载 作者:行者123 更新时间:2023-11-30 20:02:14 24 4
gpt4 key购买 nike

我想“以某种方式”完成以下工作:

public class GenericsTest<T> where T: ISomeInterface
{
private List<T> someList = new List<T>();

public List<ISomeInterface> GetList()
{
return someList; //of course this doesn't even compile
}
}

有没有办法做到这一点(就像 Java 中的通配符一样)而我只是错过了它?还是根本无法完成?

编辑:首先感谢大家的兴趣和您的回答/评论。其次,确定有办法做到这一点,可能最简单和最有效的性能(虽然不确定)是创建一个正确类型的新列表并迭代添加另一个列表的元素(在我们的例子中是 someList ) .问题是所有那些新的变化的东西,“输入”和“输出”是否有一种方法可以用“泛型方式”来做到这一点。在 Java 中可能是:

public class GenericsTest<T extends SomeInterface> {
private List<T> someList = new ArrayList<>();

public List<? extends SomeInterface> getList() {
return someList;
}
}

如果有 ,我就在徘徊? extends 在 C# 中等效。我可以接受“不”作为简短回答,我只是觉得我应该先问一下。

编辑 2:一些用户认为,另一些用户坚持认为这是与类型转换有关的问题的重复。由于我标记了最适合我的答案,为了清楚起见,我解释一下。伙计们,我不想施法。我只是在寻找 Java 通配符 with extends 约束的等价物。当然,Java 只有编译时泛型,可能会有所不同。如果 C# 中的等价物通过强制转换完成,但我知道“在 Cat 列表中有一个 Dog 对象”的问题,所以我的问题是不同的。

最佳答案

我相信这会成功:

public List<ISomeInterface> GetList()
{
return someList.Cast<ISomeInterface>().ToList();
}

你也可以这样做:

public List<ISomeInterface> GetList()
{
return someList.OfType<ISomeInterface>().ToList();
}

不同之处在于第一个选项将进行硬转换,这意味着如果其中一个元素未实现 ISomeInterface,则会抛出异常。第二个版本将只返回实现 ISomeInterface 的实例,并跳过没有实现的实例。

在您的示例中,您可以安全地使用 Cast 选项,因为您可以保证所有实例都实现 ISomeInterface

关于c# - 在 C# 中将子类型列表作为父类(super class)型列表返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17051921/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com