2012-09-17 14 views
12

Này, chúng tôi có 2 lớp:Tại sao Enumerable.Cast không sử dụng phôi do người dùng xác định?

public class A 
{ 
    public int a; 
} 

public class B 
{ 
    public int b; 

    public static implicit operator B(A x) 
    { 
     return new B { b = x.a }; 
    } 
} 

Vậy tại sao

A a = new A { a = 0 }; 
B b = a; //OK 

List<A> listA = new List<A> { new A { a = 0 } }; 
List<B> listB = listA.Cast<B>().ToList(); //throws InvalidCastException 

Cùng cho explicit điều hành.

P.S .: đúc mỗi phần tử bằng tay (separetely) hoạt động

List<B> listB = listA.Select<A, B>(s => s).ToList(); //OK 

Trả lời

10

Tên của Enumerable.Cast là sai lầm như mục đích của nó là để giá trị Unbox. Nó hoạt động trên IEnumerable (không trên IEnumerable<T>) để tạo ra một IEnumerable<T>. Nếu bạn đã có IEnumerable<T>Enumerable.Cast rất có thể không phải là phương pháp bạn muốn sử dụng.

Về mặt kỹ thuật, nó đang làm một cái gì đó như thế này:

foreach(object obj in value) 
    yield return (T)obj; 

Nếu T là cái gì khác hơn so với giá trị đóng hộp, điều này sẽ dẫn đến một InvalidCastException.

Bạn có thể kiểm tra hành vi này bản thân:

int i = 0; 
object o = i; 
double d1 = (double)i; // Works. 
double d2 = (double)o; // Throws InvalidCastException 

Bạn có hai giải pháp khả thi:

  1. Sử dụng Select(x => (B)x)
  2. Tạo một phương pháp khuyến nông Cast hoạt động trên một IEnumerable<T> chứ không phải là một IEnumerable.
+0

Vì vậy, nó không thành công vì nó cố gắng truyền 'đối tượng' sang' B', trong khi tôi đã định nghĩa một diễn viên từ 'A' thành' B'? – horgh

+0

Nó không thành công, bởi vì nó đầu tiên sẽ cần phải unbox 'object' thành' A' và hơn là cast. Một cái gì đó như '(B) (A) o'. Bạn có thể xác định một toán tử cast hoạt động trên 'object' thay vì' A' nhưng điều đó sẽ không có ý nghĩa vì hầu hết các cá thể 'object' sẽ không thể chuyển đổi được. –

+0

Nhưng nó là một 'Danh sách ' trong đó 'T' là' A'. Nó không phải là một 'ArrayList' hoặc 'List '. Tại sao vấn đề boxing/unboxing này diễn ra? – horgh

Các vấn đề liên quan