使用yield return实现强类型方法接口

7

我非常喜欢在C#中这样做:

IEnumerable GetThePizzas()
{
    yield return new NewYorkStylePizza();
    yield return new SicilianPizza();
    yield return new GreekPizza();
    yield return new ChicagoStylePizza();
    yield return new HawaiianPizza();
}

而在Java中,我会这样做:

Collection<Pizza> getThePizzas()
{
    ArrayList<Pizza> pizzas = new ArrayList<Pizza>();

    pizzas.add(new NewYorkStylePizza());
    pizzas.add(new SicilianPizza());
    pizzas.add(new GreekPizza());
    pizzas.add(new ChicagoStylePizza());
    pizzas.add(new HawaiianPizza());

    return pizzas;
}

请注意,Java代码指定了返回的类型(Pizza实例),而C#代码没有。这让我很困扰,特别是在其他程序员无法访问源代码的情况下。有没有办法解决这个问题?

更新:我的问题在于我使用了“System.Collections”而不是“System.Collections.Generic”,因此我使用的是非泛型版本的IEnumerable。


System.Collections命名空间中的集合有些已经不再被推荐使用。除非你有使用旧的非泛型集合的充分理由,否则请使用System.Collections.Generic命名空间中的泛型集合。C#/.NET中所有炫酷的功能,如LINQ都是基于泛型IEnumerable<T>接口构建的。 - dtb
我明白了...我只是缺少了System.Collections.Generic的using指令,这就是为什么它没有工作的原因。 - user356178
-1 没有包括MexicanHeatwavePizza,但+2是一个好问题 ;) - Andy
3
请注意,这两个代码完全执行不同的操作。通过使用yield生成的披萨会在需要时创建,就像最终的集合在循环遍历时一样。 - Dario
1个回答

14

使用泛型版本的IEnumerable,IEnumerable<T>,你同样可以轻松地这样做:

IEnumerable<Pizza> GetThePizzas()
{
    yield return new NewYorkStylePizza();
    yield return new SicilianPizza();
    yield return new GreekPizza();
    yield return new ChicagoStylePizza();
    yield return new HawaiianPizza();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接