代码之家  ›  专栏  ›  技术社区  ›  Arlen Beiler

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

  •  8
  • Arlen Beiler  · 技术社区  · 12 年前

    我有一个枚举,它有4个值:

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

    我有一个值数组,我想将其转换为DriveRates数组。然而,当我这样做的时候 var rates = (DriveRates[])ret; 具有 ret 作为一个数字(可能是整数)的对象数组,它说 Unable to cast object of type 'System.Object[]' to type 'ASCOM.DeviceInterface.DriveRates[]'.

    转塔 = {0,1,2,3} 。我该怎么做呢。再次,我试图将枚举值的数组转换为枚举数组。。。嗯,值:)但我正在尝试从类型转换 object[] 到类型 DriveRates[] .

    3 回复  |  直到 12 年前
        1
  •  24
  •   Jon Skeet    12 年前

    如果数组真的是 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#编译器不认为存在来自 整数[] Foo[] (在C#的规则范围内,没有)。。。但是CLR可以进行这种转换,所以只要你能说服C#编译器配合(通过强制转换为 object 首先)很好。

    当原始数组真的是 对象[] 虽然

        2
  •  1
  •   JaredPar    12 年前

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

    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;
    }
    
        3
  •  0
  •   Valikoo Vakh    7 年前

    …或使用linq,特别是如果您需要对一行中的每个元素做一些额外的事情:

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