将整数数组转换为枚举数组

9

我有一个枚举类型,包含4个值:

public enum DriveRates 
{ 
    driveSidereal = 0,
    driveLunar = 1, 
    driveSolar = 2, 
    driveKing = 3 
} 

我有一个值数组,我想将其转换为DriveRates数组。然而,当我执行var rates = (DriveRates[])ret;时,其中ret是一个数字(可能是整数)的对象数组,它会显示无法将类型为“System.Object []”的对象强制转换为类型“ASCOM.DeviceInterface.DriveRates []”。 ret={0,1,2,3}。我应该怎么做呢?再次说明,我正在尝试将枚举值数组转换为枚举值数组 :) 但我要从类型object[]转换为类型DriveRates[]
3个回答

25

如果数组确实是 object[],那么你不能只强制转换数组。不过,你可以很容易地创建一个新数组:

var enumArray = originalArray.Cast<DriveRates>().ToArray();

如果一开始它实际上是一个int[]数组,你可以进行强制转换——尽管你首先需要与C#编译器友好交谈:

using System;

class Program
{
    enum Foo
    {
        Bar = 1,
        Baz = 2
    }

    static void Main()
    {
        int[] ints = new int[] { 1, 2 };
        Foo[] foos = (Foo[]) (object) ints;
        foreach (var foo in foos)
        {
            Console.WriteLine(foo);
        }
    }
}

在C#规则范围内,C#编译器不认为int[]可以转换为Foo[](实际上也确实不行)...... 但是CLR允许这种转换,只要你能说服C#编译器配合(通过先强制转换为object),那就没问题。

但是,当原始数组真正是object[]时,这种方法不起作用


嗯...是的,这是一个对象数组。显然,对象数组无法转换为整数数组。 - Arlen Beiler
@ArlenBeiler:它可以转换为一个新的数组 - 但是现有数组不能仅被视为int数组,因为它们具有不同的表示形式。 - Jon Skeet
值得注意的是,即使是isas运算符也可能会混淆枚举数组的类型,请参见https://dev59.com/zHRB5IYBdhLWcg3w6LR2#21186137中的最后一段代码片段 - 所有三个检查都显示“true”,而.GetType()当然不是。 - quetzalcoatl

1

这是不可能的。无法在引用类型数组和值类型数组之间进行转换。您需要手动将元素复制到新数组中。

DriveRates[] Convert(object[] source) { 
  var dest = new DriveRates[source.Length];
  for (int i = 0; i < source.Length; i++) { 
    dest[i] = (DriveRates)source[i];
  }
  return dest;
}

0

... 或者使用 LINQ,特别是当您需要在一行中对每个元素进行一些额外的操作时:

DriveRates[] enumArray = originalArray.Select(o => (DriveRates)o).ToArray();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接