IEnumerable.Cast () против приведения в IEnumerable.Select () - PullRequest
10 голосов
/ 26 марта 2012

Предположим, у меня есть IEnumerable<int>, и я хочу, чтобы они были преобразованы в их ASCII-эквивалентные символы.

Для одного целого числа это будет просто (char)i, поэтому всегда есть collection.Select(i => (char)i), но я подумал, что будет немного лучше использовать collection.Cast().

Может кто-нибудь объяснить, почему я получаю InvalidCastException, когда использую collection.Cast<char>(), но не с collection.Select(i => (char)i)?

Редактировать: Интересно, что когда я звоню collection.OfType<char>(), я получаю пустой набор.

1 Ответ

11 голосов
/ 26 марта 2012

Методы Cast<T> и OfType<T> выполняют только преобразования ссылок и распаковки. Поэтому они не могут преобразовать один тип значения в другой тип значения.

Методы работают с неуниверсальным интерфейсом IEnumerable, поэтому они по сути преобразуются из IEnumerable<object> в IEnumerable<T>. Итак, причина, по которой вы не можете использовать Cast<T> для преобразования из IEnumerable<int> в IEnumerable<char>, заключается в том, что вы не можете разыграть int в штучной упаковке char.

По сути, Cast<char> в вашем примере завершается ошибкой, потому что следующие ошибки:

object ascii = 65;
char ch = (char)ascii;   <- InvalidCastException

См. Превосходное сообщение Джона Скита EduLinq для получения более подробной информации.

...