代码之家  ›  专栏  ›  技术社区  ›  Joel Coehoorn

从对象结果继承IEnumerable

  •  1
  • Joel Coehoorn  · 技术社区  · 16 年前

    我给 this question ,在结尾处包含一个非常简短的rant,说明String.Split()应该如何接受IEnumerable<String>而不是String[]。

    这让我思考。如果其他所有内容都继承自的基类为IEnumerable提供了默认实现,这样所有内容现在只返回一个项(本身)上的枚举器,除非它被重写以执行与集合类类似的其他操作。

    我确信有各种各样的理由不这样做,其中最重要的一点是,如果所有东西都实现了IEnumerable,那么实现偏离默认值的少数类的行为可能会不同于您在某些场景中的预期。但我仍然认为这将是一个有趣的练习:会有什么其他后果?

    3 回复  |  直到 8 年前
        1
  •  2
  •   Amy B    16 年前
    public static IEnumerable<object> ToEnumerable(this object someObject)
    {
        return System.Linq.Enumerable.Repeat(someObject, 1);
    }
    
        2
  •  0
  •   Leahn Novash    16 年前

    您是否考虑过使用helper对象并为IEnumerable类实现拆分?

        3
  •  0
  •   MagicKat    16 年前

    索引运算符([])不是IEnumerable<t>合同的一部分; 在查看反射器中的代码后,代码大量使用索引运算符,而索引运算符始终是数组的一部分。

    简单地说,数组总是有一个枚举器。

    这样的想法是,如果String.Split()之类的方法确实接受了IEnumerable而不是数组,那么我就可以向函数传递一个字符串,这样它就可以正常工作,而不必过多地创建分隔符数组。

    这不是真的,字符串继承了IEnumerable<char>并且您没有泛型方差,因此不能将IEnumerable<char>强制转换为IEnumerable<string>。您将得到分割的IEnumerable<char>版本,而不是所需的字符串。