InvalidCastOperation异常 - 找不到什么错误

时间:2009-12-21 19:50:31

标签: c# casting

我有以下两种方法,最后一种抛出InvalidCastOperationException,我看不出有什么问题。

       public static ArrayList GetEmployeesArrayList()
       {
            ArrayList al = new ArrayList();

           // do some work here...
            return (al);

        }

        public static Employee[] GetEmployeeArray()
        {
            return ((Employee[])GetEmployeesArrayList().ToArray());  <-- Throws invalid cast exception (Cannot cast Employee[] from Object...
        }

4 个答案:

答案 0 :(得分:7)

ArrayList.ToArray()返回一个Object [] - 我认为你不能直接将它转换为Employee []。

更好的方法是使用ArrayList.ToArray(Type),它接受一个Type参数,指定要返回的对象类型。例如:

return GetEmployeesArrayList().ToArray(typeof(Employee));

http://msdn.microsoft.com/en-us/library/system.collections.arraylist.toarray.aspx

答案 1 :(得分:5)

您可以尝试删除parens:

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

但是,点运算符的优先级高于强制转换,因此除非这是拼写错误,否则上述操作不起作用。

在这种情况下,您似乎添加到ArrayList的所有元素都不是“Employee”类型。

旁注:为什么不使用List<Employee>

修改 Josh的回答是正确的。我一开始没有看到ArrayList.ToArray创建了一个Object [],而不是只是转换为Object []。您不能将此转换为Employee [],除非您调用Array.ConvertAll<TInput, TOutput>或使用类型特定的重载,正如Josh正确指出的那样。

答案 2 :(得分:2)

我几乎放弃了对ArrayList的所有使用,但是我猜测作为对象的ArrayList不能被强制转换为Employees数组,即使你的数组​​中除了Employee对象之外什么都没有。

这是泛型的教科书案例。使用Employee对象列表,您应该清楚。如果需要使用数组,List支持ToArray函数。

public static List<Employee> GetEmployeeList()
{
    List<Employee> EmpList = new List<Employee>();
    ... do stuff
    return EmpList;
}

public static Employee[] GetEmployeeArray()
{
    return GetEmployeeList().ToArray();
}

答案 3 :(得分:0)

未键入ArrayLists,因此当您调用ToArray()时,ArrayList不会检查每个对象是否属于给定类型,它只返回一个对象[]。它可能无法转换为Employee []。

但是,你可以让ArrayList强制执行Employee数组中的每个对象都是一个Employee,然后将结果对象[]返回给Employee []

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

虽然返回类型是object [],但现在它实际上是一个返回的Employee []并且可以被转换为Employee [],因为它正是它的原样。