铸造整数数组来枚举的阵列(Casting an array of integers to an ar

2019-08-17 06:54发布

我有一个具有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[]'.

ret = {0,1,2,3} 。 我应该怎么做这个代替。 同样,我试图枚举值的数组转换为枚举的数组...好,值:)不过我想从类型转换object[]输入DriveRates[]

Answer 1:

你不能只是投的数组,如果它真是一个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#编译器并不认为有从转换int[]Foo[]并没有,C#的规则之内)......但CLR是罚款与此转换,所以只要你能说服C#编译器一起玩(转换为object第一)它的罚款。

当原始阵列是一个真正的,这并不工作object[]虽然。



Answer 2:

这是不可能的。 没有办法引用类型的数组和值类型的阵列之间来铸造。 你需要的元素手动复制到新的数组

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;
}


Answer 3:

...或使用LINQ,特别是如果你需要做一些额外的事情在一条线的每一个元素:

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


文章来源: Casting an array of integers to an array of enums
标签: c# .net-4.0