InvalidCastOperation异常 - 找不到什么错误

Ton*_*ion 0 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...
        }
Run Code Online (Sandbox Code Playgroud)

Jos*_*ger 7

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

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

return GetEmployeesArrayList().ToArray(typeof(Employee));
Run Code Online (Sandbox Code Playgroud)

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


cod*_*zen 5

您可以尝试删除parens:

public static Employee[] GetEmployeeArray()        
{           
    return (Employee[])GetEmployeesArrayList().ToArray(); 
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

编辑: 乔希的回答是对的.我一开始没有看到ArrayList.ToArray创建了一个Object [],而不是只是转换为Object [].除非你Array.ConvertAll<TInput, TOutput>按照Josh正确指出的那样调用或使用类型特定的重载,否则你不能将它强制转换为Employee [] .

  • 答案为+1.如果您遇到错误而无法理解,我还建议将代码拆分为多行.你在一条线上有很多东西,拆分它会使每一步的验证变得更容易.不要玩Code Golf. (3认同)