Наследовать IEnumerable от объекта последствия - PullRequest
1 голос
/ 01 октября 2008

Я отправил ответ на на этот вопрос , включая в конце очень короткую рутину о том, как String.Split () должен принимать IEnumerable вместо строки [].

Это заставило меня задуматься. Что делать, если базовый класс Object, от которого все остальное наследует, обеспечивает реализацию по умолчанию для IEnumerable, так что теперь все возвращает Enumerator только для одного элемента (самого себя) - если только он не переопределен, чтобы сделать что-то еще, как с классами коллекций.

Идея состоит в том, что тогда, если бы такие методы, как String.Split () принимали IEnumerable, а не массив, я мог бы передать в функцию одну строку, и она бы просто работала, а не создавала массив-разделитель.

Я уверен, что есть множество причин не делать этого, не в последнюю очередь из-за того, что если бы все реализовывало IEnumerable, то несколько классов, реализация которых отклоняется от значения по умолчанию, могли бы вести себя иначе, чем вы ожидаете в определенные сценарии. Но я все еще думал, что это будет забавное упражнение: какие еще будут последствия?

Ответы [ 3 ]

2 голосов
/ 01 октября 2008
public static IEnumerable<object> ToEnumerable(this object someObject)
{
    return System.Linq.Enumerable.Repeat(someObject, 1);
}
0 голосов
/ 01 октября 2008

Задумывались ли вы об использовании вспомогательного объекта и реализации Split для класса IEnumerable?

Однажды я сделал GetDescription для класса Enum, чтобы легко получить DescriptionAttribute. Работает на удивление хорошо.

0 голосов
/ 01 октября 2008

оператор индекса ([]) не является частью договора IEnumerable Посмотрев на код в отражателе, код интенсивно использует оператор индекса, который всегда является частью массива.

Проще говоря, Array всегда будет иметь счетчик.

Идея состоит в том, что тогда, если бы такие методы, как String.Split () принимали IEnumerable, а не массив, я мог бы передать в функцию одну строку, и она бы просто работала, а не создавала массив разделителей.

Это не так, строка наследует IEnumerable И у вас нет общей дисперсии, поэтому вы не можете привести IEnumerable к IEnumerable . Вы получите IEnumerable версии (версий) split, а не требуемую строку.

...