2010-07-29 35 views
6

Khi cố gắng để trả lời this question, tôi phát hiện ra những điều sau đây:Đúc và LINQ Cast <T>()

string s = "test"; 

var result1 = s.Select(c => (ushort)c); // works fine 

var result2 = s.Cast<ushort>(); // throws an invalid cast exception 

Tại sao Cast<T>() thất bại ở đây? Có gì khác biệt?

Trả lời

12

nghĩ bạn sẽ tìm thấy câu trả lời của bạn ở đây:

Puzzling Enumerable.Cast InvalidCastException

Phần cuối cùng, dưới Edit:

Cast<T>() là một phương pháp mở rộng trên IEnumerable hơn IEnumerable<T>. Điều đó có nghĩa rằng vào thời gian mỗi giá trị được cho điểm nơi nó đang được dàn diễn viên, nó đã được đóng hộp lại thành một System.Object

+1

Cảm ơn Martin. Nó thật thú vị. Vì vậy, Cast có lẽ nên tránh dù sao cho hiệu suất boxing vốn có. Tôi ngạc nhiên MSDN không đề cập đến bất cứ nơi nào (mà tôi có thể tìm thấy, anyway). – fearofawhackplanet

+5

'Cast ' chỉ được sử dụng để đưa một 'IEnumerable' lên đến mức của một' IEnumerable ', nơi tất cả các toán tử LINQ khác được định nghĩa. Lấy một 'IEnumerable 'và chuyển nó thành một' IEnumerable 'là một phép chiếu, được thực hiện bằng' Chọn'. Thực tế là 'Cast' thậm chí có thể trên một' IEnumerable 'chỉ đơn thuần là vì' IEnumerable 'kế thừa từ 'IEnumerable' - không có lý do nào khác. –

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