7

我有一个具有 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}。我应该怎么做呢。同样,我正在尝试将枚举值数组转换为枚举数组...嗯,值 :) 但我正在尝试从 type 转换object[]为 type DriveRates[]

4

3 回答 3

21

如果它真的是一个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[]to的转换Foo[](在 C# 的规则范围内也没有)...但是 CLR 对这种转换很好,只要你能说服 C# 编译器玩沿着(通过投射到object第一个)很好。

当原始数组确实是一个虽然时,这不起作用。object[]

于 2013-03-01T23:52:05.863 回答
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;
}
于 2013-03-01T23:51:38.273 回答
0

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

DriveRates[] enumArray = originalArray.Select(o => (DriveRates)o).ToArray();
于 2017-12-12T19:40:52.197 回答