2013-03-01 43 views
6

Tôi có một enum có 4 giá trị:Đúc một mảng các số nguyên tới một mảng của enums

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

Tôi có một mảng các giá trị mà tôi muốn truyền tới một mảng của DriveRates. Tuy nhiên khi tôi làm var rates = (DriveRates[])ret;, với ret là một mảng đối tượng số (có thể là số nguyên), nó nói Unable to cast object of type 'System.Object[]' to type 'ASCOM.DeviceInterface.DriveRates[]'.

ret = {0,1,2,3}. Làm thế nào tôi nên làm điều này để thay thế. Một lần nữa, tôi đang cố gắng chuyển đổi một mảng các giá trị enum thành một mảng enum ... well, values ​​:) Nhưng tôi đang cố gắng chuyển đổi từ loại object[] thành loại DriveRates[].

Trả lời

19

Bạn không thể truyền mảng nếu đó thực sự là object[]. Bạn thể tạo ra một mảng mới khá dễ dàng mặc dù:

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

Nếu nó là thực một mảng int[] để bắt đầu, bạn có thể đúc - mặc dù bạn sẽ phải nói chuyện độc đáo để trình biên dịch C# đầu tiên:

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ác biên dịch C# không tin rằng có một sự chuyển đổi từ int[] để Foo[] (và không có, trong các quy tắc của C#) ... nhưng CLR là tốt với chuyển đổi này, do đó, miễn khi bạn có thể thuyết phục C# trình biên dịch phát cùng (bằng cách truyền tới số object trước).

này không hoạt động khi mảng gốc thực sự là object[].

+0

Hmm ... Vâng, đó là một mảng của các đối tượng. Rõ ràng một mảng các đối tượng không thể được chuyển đổi thành một mảng các int. –

+0

@ArlenBeiler: Vâng, nó có thể được chuyển đổi thành mảng * mới * - nhưng mảng * hiện tại * không thể được xử lý như một mảng int, vì chúng có các biểu diễn khác nhau. –

+0

Điều đáng chú ý là ngay cả các toán tử 'is' và' as' có thể bị lẫn lộn với các loại mảng enum, hãy xem đoạn mã cuối cùng tại http://stackoverflow.com/a/21186137/717732 - cả ba kiểm tra đều nói 'true' , trong khi '.GetType()' tất nhiên nói không. – quetzalcoatl

1

Điều này là không thể. Không có cách nào để truyền giữa một mảng các kiểu tham chiếu và một mảng các kiểu giá trị. Bạn sẽ cần phải sao chép các phần tử theo cách thủ công vào mảng mới

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

... hoặc với LINQ, đặc biệt là nếu bạn cần phải làm một số việc thêm với mọi phần tử trong một dòng:

DriveRates[] enumArray = originalArray.Select(o => (DriveRates)o).ToArray(); 
Các vấn đề liên quan