我有一个具有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[]
你不能只是投的数组,如果它真是一个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[]
虽然。
这是不可能的。 没有办法引用类型的数组和值类型的阵列之间来铸造。 你需要的元素手动复制到新的数组
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;
}
...或使用LINQ,特别是如果你需要做一些额外的事情在一条线的每一个元素:
DriveRates[] enumArray = originalArray.Select(o => (DriveRates)o).ToArray();