我有一个包含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[]
。< / p>
答案 0 :(得分: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[]
到Foo[]
的转换(并且在C#的规则中没有)...但是这个转换的CLR没问题,所以只要你能说服C#编译器一起玩(先通过强制转换为object
)就可以了。
当原始数组真的是object[]
时, 。
答案 1 :(得分: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;
}
答案 2 :(得分:-1)
...或者使用linq,特别是如果你需要对一行中的每个元素做一些额外的事情:
DriveRates[] enumArray = originalArray.Select(o => (DriveRates)o).ToArray();