Unable to cast object of type 'System.Object[]' to type...
От: O-Sam Россия  
Дата: 23.07.08 10:18
Оценка:
Доброго времени суток!

Читаю сейчас книгу Pro LINQ, там есть пример кода, который не хочет исполняться на моей 2008-й студии

в классе Employee имеем метод

public static ArrayList GetEmployeesArrayList() {...}

и метод

public static Employee[] GetEmployeesArray()
{
      return ((Employee[])GetEmployeesArrayList().ToArray());
}


где у меня вылетает ексепшен Unable to cast object of type 'System.Object[]' to type 'LinqTest01.Employee[]'

То есть GetEmployeesArrayList всё возвращает, ToArray() выполняется, а вот приведение к (Employee[]) не проходит.

Так и должно быть и в книге косяк, или я чего-то не понимаю?
Re: Unable to cast object of type 'System.Object[]' to type.
От: Хэлкар  
Дата: 23.07.08 10:27
Оценка:
OS>где у меня вылетает ексепшен Unable to cast object of type 'System.Object[]' to type 'LinqTest01.Employee[]'

OS>То есть GetEmployeesArrayList всё возвращает, ToArray() выполняется, а вот приведение к (Employee[]) не проходит.


OS>Так и должно быть и в книге косяк, или я чего-то не понимаю?


Это абсолютно правильное поведение System.Object[] не является предком Employee[]

Могу предложить решение в виде
GetEmployeesArrayList().Cast<Employee>()

Оно возвращает IEnumerable<Employee>.
Re: Unable to cast object of type 'System.Object[]' to type.
От: Аноним  
Дата: 23.07.08 10:29
Оценка:
Здравствуйте, O-Sam, Вы писали:

OS>Доброго времени суток!


OS>Читаю сейчас книгу Pro LINQ, там есть пример кода, который не хочет исполняться на моей 2008-й студии


OS>в классе Employee имеем метод


OS>public static ArrayList GetEmployeesArrayList() {...}


OS>и метод


OS>
OS>public static Employee[] GetEmployeesArray()
OS>{
OS>      return ((Employee[])GetEmployeesArrayList().ToArray());
OS>}
OS>


OS>где у меня вылетает ексепшен Unable to cast object of type 'System.Object[]' to type 'LinqTest01.Employee[]'


OS>То есть GetEmployeesArrayList всё возвращает, ToArray() выполняется, а вот приведение к (Employee[]) не проходит.


OS>Так и должно быть и в книге косяк, или я чего-то не понимаю?


Один вопрос: а зачем ArrayList использовать? В этом есть тайный смысл?
Re[2]: Unable to cast object of type 'System.Object[]' to ty
От: O-Sam Россия  
Дата: 23.07.08 10:38
Оценка:
Здравствуйте, Аноним, Вы писали:

OS>>Так и должно быть и в книге косяк, или я чего-то не понимаю?


А>Один вопрос: а зачем ArrayList использовать? В этом есть тайный смысл?


Тайный смысл — скомпилировать пример из книги
Re: Unable to cast object of type 'System.Object[]' to type.
От: Lloyd Россия  
Дата: 23.07.08 12:00
Оценка:
Здравствуйте, O-Sam, Вы писали:

OS>
OS>public static Employee[] GetEmployeesArray()
OS>{
OS>      return ((Employee[])GetEmployeesArrayList().ToArray(typeof(Employee)));
OS>}
OS>
... << RSDN@Home 1.2.0 alpha rev. 786>>
Re[2]: Unable to cast object of type 'System.Object[]' to ty
От: Аноним  
Дата: 23.07.08 12:50
Оценка:
Здравствуйте, Хэлкар, Вы писали:

Х>Это абсолютно правильное поведение System.Object[] не является предком Employee[]


Вот интересный пример:

using System;

class Program
{
    static void Main()
    {
        object[] x = new string[]{"A","B"};
        object[] y = new object[]{"A","B"};
        Console.WriteLine((string[])x); // OK
        Console.WriteLine((string[])y); // Exception
    }
}


Хотя оба массива хранят только строки.
Re[3]: Unable to cast object of type 'System.Object[]' to ty
От: Хэлкар  
Дата: 23.07.08 13:00
Оценка:
А>Хотя оба массива хранят только строки.

Ну собственно а с чего должно быть обратное?
Re[3]: Unable to cast object of type 'System.Object[]' to ty
От: _FRED_ Черногория
Дата: 23.07.08 13:51
Оценка:
Здравствуйте, Аноним, Вы писали:

Х>>Это абсолютно правильное поведение System.Object[] не является предком Employee[]

А>Вот интересный пример:

Чтобы перемер перестал казаться интересным, достаточно сравнить GetType() у переменных "x" и "y"
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.