从对象后果继承IEnumerable

时间:2020-03-06 14:56:45  来源:igfitidea点击:

我发布了这个问题的答案,最后包括一小段关于String.Split()应该如何接受IEnumerable <string>而不是string []的咆哮。

那让我开始思考。如果继承自其他所有对象的基础Object类提供了IEnumerable的默认实现,使得现在所有内容都恰好在一个项目(本身)上返回了一个Enumerator,除非它被覆盖以对collections类进行其他操作,该怎么办。

这样的想法是,如果String.Split()之类的方法确实接受IEnumerable而不是数组,我可以将单个字符串传递给函数,这样就可以了,而不必过多地创建分隔符数组。

我敢肯定,有各种各样的原因不执行此操作,其中最重要的是,如果所有内容都实现了IEnumerable,那么在默认情况下实现偏离默认值的少数类的行为可能会与我们期望的有所不同。但是我仍然认为这将是一个有趣的练习:还会有什么其他后果?

解决方案

索引运算符([])不属于IEnumerable <T>的合同的一部分
在反射器中查看代码后,代码大量使用了索引运算符,该运算符始终是Array的一部分。

好吧,简单地说,Array将始终具有一个枚举器。

The idea is that then if methods like String.Split() did accept IEnumerable rather than an array I could pass a single string to the function and it would just work, rather than having to much about with creating a separator array.

这是不正确的,字符串继承了IEnumerable <char>,并且没有通用的方差,因此无法将IEnumerable <char>转换为IEnumerable <string>。我们将获得分割的IEnumerable <char>版本,而不是所需的字符串。

我们是否考虑过使用辅助对象并为IEnumerable类实现Split?

我曾经为Enum类做一个GetDescription以便于轻松获得DescriptionAttribute的信息。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。它的运作异常出色。

public static IEnumerable<object> ToEnumerable(this object someObject)
{
    return System.Linq.Enumerable.Repeat(someObject, 1);
}