Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# InvalidCastOperation异常-can';找不到什么';这是不对的_C#_Casting - Fatal编程技术网

C# InvalidCastOperation异常-can';找不到什么';这是不对的

C# InvalidCastOperation异常-can';找不到什么';这是不对的,c#,casting,C#,Casting,我有以下两个方法,最后一个抛出一个InvalidCastOperationException,我看不出有什么问题 public static ArrayList GetEmployeesArrayList() { ArrayList al = new ArrayList(); // do some work here... return (al); } publ

我有以下两个方法,最后一个抛出一个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...
        }
公共静态数组列表GetEmployeesArrayList()
{
ArrayList al=新的ArrayList();
//在这里做一些工作。。。
返回(al);
}
公共静态员工[]GetEmployeeArray()
{

return((Employee[])GetEmployeesArray().ToArray());您可以尝试删除参数:

public static Employee[] GetEmployeeArray()        
{           
    return (Employee[])GetEmployeesArrayList().ToArray(); 
}
但是,点运算符的优先级高于强制转换,因此,除非这是一个打字错误,否则上述操作将不起作用

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

旁注:为什么不直接使用
列表

编辑: Josh的回答是正确的。起初我没有看到ArrayList.ToArray创建了一个对象[],而不仅仅是强制转换到对象[]。除非调用
Array.ConvertAll
或使用Josh正确指出的特定于类型的重载,否则无法将其强制转换到员工[]。

ArrayList.ToArray()返回一个对象[]--我不认为你可以直接把这件事告诉员工[]

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

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

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

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

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

public static Employee[] GetEmployeeArray()
{
    return GetEmployeeList().ToArray();
}
公共静态列表GetEmployeeList()
{
List EmpList=新列表();
…做事
返回雇主;
}
公共静态员工[]GetEmployeeArray()
{
返回GetEmployeeList().ToArray();
}

ArrayList不是类型化的,因此当您调用ToArray()时,ArrayList不会检查每个对象是否为给定类型,它只会返回一个对象[]。它可能不可强制转换为Employee[]

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

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

尽管返回类型是object[],但现在它实际上是一个正在返回的雇员[],可以将其强制转换为雇员[]因为这正是问题所在。

+1作为答案。当您遇到不理解的错误时,我还建议您将代码分成多行。您在一行上有很多内容,将其拆分将使每一步都更容易验证。不要玩代码高尔夫。这应该是返回GetEmployeesArrayList().ToArray(员工类型);