Вы уверены, что метод Select возвращает массив? Кастинг + дженерики = код запаха
Попробуйте это:
double[] max = data
.Select(crArray => crArray.Select( cr => cr.ValueNorm ).Max())
.ToArray();
Метод преобразования - (ToArray) выделяет новый массив и заполняет его. Связан ограничениями методов.
Down Casting - позволяет изменить тип ссылки на экземпляр объекта.
Разрешается только фактический тип экземпляра или некоторый тип, от которого наследуется тип экземпляра. Все остальное дает исключение во время выполнения.
Оператор явного преобразования - использует синтаксис понижающего преобразования, чтобы добиться эффекта преобразования. Это действительно метод конверсии. Это бесконечный источник путаницы для людей, пытающихся понять кастинг.
Рассмотрим этот код:
// reference type is IEnumerable<string>, instance type is string[]
IEnumerable<string> myArray =
new string[3] { "abc", "def", "ghi" };
// reference type is IEnumerable<string>, instance type is ???
IEnumerable<string> myQuery = myArray
.Select(s => s.Reverse().ToString());
//Cast - works
string[] result = (string[]) myArray;
//Cast - runtime exception: System.InvalidCastException
result = (string[])myQuery;
//Conversion - works
result = myQuery.ToArray();
Почему вы не получили исключение времени выполнения в vs? Я не знаю.