2013-03-01 220 views
6

数组我有一个具有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[]类型。

回答

19

你不能只是投的数组,如果它真是一个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[]虽然。

+0

嗯......是的,这是对象的数组。显然,一个对象数组不能转换为一个int数组。 – 2013-03-02 00:01:58

+0

@ArlenBeiler:它可以被转换为* new *数组 - 但是*存在*数组不能被视为一个int数组,因为它们具有不同的表示形式。 – 2013-03-02 00:12:39

+0

值得注意的是,即使'是'和''''操作符也可能与enum数组的类型混淆,请参阅http://stackoverflow.com/a/21186137/717732上的最后一个片段 - 所有三个检查都会显示'true' ,而'.GetType()'当然不是。 – quetzalcoatl 2014-01-17 12:49:44

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

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

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