2013-03-01 5 views
6

Ho un enum che ha 4 valori:Casting un array di interi a una matrice di enumerazioni

public enum DriveRates 
{ 
    driveSidereal = 0, 
    driveLunar = 1, 
    driveSolar = 2, 
    driveKing = 3 
} 

ho un array di valori che voglio lanciare a una serie di DriveRates. Tuttavia quando lo faccio var rates = (DriveRates[])ret;, con ret essendo una matrice di oggetti di numeri interi (probabilmente), si dice Unable to cast object of type 'System.Object[]' to type 'ASCOM.DeviceInterface.DriveRates[]'.

ret = {0,1,2,3}. Come dovrei farlo invece. Di nuovo, sto provando a convertire un array di valori enum in un array di enum ... beh, valori :) Ma sto provando a convertire dal tipo object[] al tipo DriveRates[].

risposta

19

Non si può semplicemente lanciare la matrice, se è davvero un object[]. È possibile creare un nuovo array abbastanza facilmente se:

var enumArray = originalArray.Cast<DriveRates>().ToArray(); 

Se fosse realtà un int[] array per cominciare, si potrebbe lanciare - anche se avrebbe dovuto parlare bene per il compilatore C# prima:

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

il compilatore C# non crede che ci sia una conversione da int[] a Foo[] (e non c'è, nel rispetto delle regole di C#) ... ma il CLR è bene con questa conversione, in modo il più a lungo come puoi persuadere il C# compilatore per giocare insieme (lanciando per primo a object) va bene.

Questo non funziona quando l'array originale è in realtà un object[].

+0

Hmm ... sì, è un array di oggetti. Apparentemente una matrice di oggetti non può essere convertita in una matrice di interi. –

+0

@ArlenBeiler: beh, può essere convertito in un * nuovo * array, ma l'array * esistente * non può essere semplicemente trattato come una matrice di ints, poiché hanno rappresentazioni diverse. –

+0

Vale la pena notare che anche 'is' e' as' gli operatori potrebbero confondersi con i tipi di enum array, vedere l'ultimo snippet su http://stackoverflow.com/a/21186137/717732 - tutti e tre i controlli dicono 'true' , mentre '.GetType()' ovviamente non dice. – quetzalcoatl

1

Questo non è possibile. Non è possibile eseguire il cast tra una matrice di tipi di riferimento e una matrice di tipi di valori. Sarà necessario copiare manualmente gli elementi nel nuovo array

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

... o con LINQ, soprattutto se avete bisogno di fare alcune cose in più con ogni elemento in una sola riga:

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