2013-03-01 135 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();