Почему Enumerable.Cast вызывает исключение InvalidCastException? - PullRequest
39 голосов
/ 03 мая 2010

Если я могу неявно привести целое значение к двойному, например:

int a = 4;    
double b = a;
// now b holds 4.0

Почему я не могу сделать это:

int[] intNumbers = {10, 6, 1, 9};    
double[] doubleNumbers2 = intNumbers.Cast<double>().ToArray();

Я получаю "Указанное приведение неверно" InvalidCastException исключение.

Выполнение противоположного (приведение к двойному к int) приводит к той же ошибке.

Что я делаю не так?

Ответы [ 2 ]

55 голосов
/ 04 мая 2010

Ну, у вас неверные ожидания в Cast, вот и все - он предназначен для работы с боксом / распаковкой, ссылками и конвертацией идентичности, и все К сожалению, документация не так ясна, как могла бы быть: (

Решение заключается в использовании Select:

doubleNumbers2 = intNumbers.Select(x => (double) x).ToArray();
8 голосов
/ 04 мая 2010

Добавление к приему ответов Джона в основном полезно для объектов, которые реализуют IEnumerable, но ничего больше. Например, XmlNodeList . Если у вас нет возможности использовать System.Xml.Linq пространство имен, вы можете использовать Cast<XmlElement>, чтобы написать несколько симпатичных запросов LINQ к нему.

var result = xmlNodeList
    .Cast<XmlElement>()
    .Select(e=> e.GetAttribute("A") + e.GetAttribute("B"))
    .ToArray();
...