Интерфейс Downcasting - PullRequest
       21

Интерфейс Downcasting

1 голос
/ 01 октября 2011

Предположим, у меня есть следующий метод расширения, чтобы можно было принудительно оценить IEnumerable:

public static List<T> EvaluateNow<T>(this IEnumerable<T> collection)
{
    if (collection == null)
    {
        throw new ArgumentNullException("collection");
    }
    else
    {
        return (collection.ToList());
    }
}

Я хотел бы спросить, есть ли смысл вместо IList<T>List<T> в качестве возвращаемого типа этого метода (т. е. передачи в интерфейс), чтобы связать ни его, ни его зависимости с конкретной реализацией (даже если возвращаемое значение всегда будет List).

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Это всегда хорошая идея использовать интерфейсы в подобных ситуациях, а не в классах.
Причин, по которым здесь слишком много, чтобы их использовать, но, например, это значительно увеличивает гибкость, поскольку любому классу просто нужно реализовать интерфейс IList<T>, чтобы его можно было присвоить возвращаемому значению этой функции. Классы будут реализовывать этот (или другой) интерфейс без подкласса List (или его эквивалента).
В общем, вы хотите использовать «самый низкий» иерархический интерфейс, который соответствует требованиям. В этом случае вы можете рассмотреть ICollection или даже IEnumerable вместо IList.

Не имеет значения, какой экземпляр класса вы возвращаете из функции, поскольку возвращается только «интерфейс», поэтому он может быть назначен любому классу, реализующему этот интерфейс (опять же, max flexibilty?)

Часто функция, возвращающая некоторый объект IEnumerable, будет в основном использоваться внутри цикла foreach.

1 голос
/ 01 октября 2011

Метод расширения может быть вызван только для экземпляра. Это означает, что collection никогда не может быть null в вашем методе.

Итак ... как написано, ваш метод работает точно так же, как и метод расширения IEnumerable.ToList, поэтому я не вижу смысла.

Было бы полезно, если бы возвращаемый тип был IList, как Аарон объясняет в свой ответ .

Почему IEnumerable.ToList еще не возвращает IList, было бы хорошим вопросом для разработчиков библиотек.

...