2014-05-07 13 views
5

tôi đã chuyển vùng xung quanh trong các trang web khác nhau cho các kỹ thuật đúc và tôi xây dựng đoạn mã sau để cast đến từ float để int như hình dưới đâyTruy vấn LINQ ném một InvalidCastException?

var floatList = new float[] { 2.7f, 3.1f, 4.5f }; 
var intList = from int test1 in floatList 
       select test1; 

foreach (var v in intList) 
    Console.Write("{0} ", v.ToString()); 

Nhưng trên mã ném một InvalidCastException. Tại sao điều này? Tôi nghĩ rằng nó có nghĩa vụ phải in 3,34.

Trả lời

14

Một khoản LINQ có dạng:

from X x in y 

tương đương với

y.Cast<X>() 

và sau đó sử dụng x như biến phạm vi sau này. Phần còn lại của câu hỏi của bạn là thoái hóa, do đó, mã của bạn là tương đương với:

var intList = floatList.Cast<int>(); 

Bây giờ Enumerable.Cast() không không làm chuyển đổi như thế này - nó chỉ không chuyển đổi tài liệu tham khảo và boxing/chuyển đổi unboxing. Đối với bất kỳ chuyển đổi khác, bạn cần Select:

var intList = floatList.Select(x => (int) x); 

Hoặc nếu bạn thực sự sử dụng một biểu thức truy vấn:

var intList = from x in floatList select (int) x; 

... nhưng cá nhân cho các truy vấn đơn giản như thế này, tôi sẽ không sử dụng biểu thức truy vấn - Tôi chỉ sử dụng lệnh gọi phương thức như được hiển thị ở trên.

+0

+1 để hiểu rõ hơn về những gì thực sự xảy ra. –

+0

thanx để trả lời Jon và yes Tôi rất thích đi truy vấn đơn giản .. và câu trả lời ở đây là gì: - 2,3,4 hoặc 3,3,4? – Neel

+0

@Neel, tôi nghĩ bạn muốn làm tròn, chứ không phải diễn viên đúng không? Trong trường hợp đó, bạn có thể sử dụng 'var intList = floatList.Select (x => (int) Math.Round (x)); ' –

5

Điều này là do không có int s trong floats và bởi int i bạn chỉ định để tìm kiếm int s, gây ra một dàn diễn viên nội bộ mà không hoạt động (như int i = 2.7f;).

Tôi nghĩ rằng đây sẽ là cách nó hoạt động:

var ints = from f in floats 
      select (int)f; 
+0

thanx để trả lời :) – Neel