2010-03-02 28 views

Trả lời

11

Yup, Cast không làm điều đó. Về cơ bản, nó chỉ tham chiếu chuyển đổi và chuyển đổi unboxing - không chuyển đổi giữa các loại giá trị khác nhau.

Sử dụng này để thay thế:

(new[]{1,2,3}).Select(x => (decimal)x) 

Lưu ý rằng pre-.NET 3.5 SP1, Cast đã một số chi tiết chuyển đổi hơn là bây giờ. Tôi không biết liệu nó có hiệu quả hay không, nhưng chắc chắn không phải lúc này.

+1

Bạn đang quá nhanh. :) –

+0

Để biết một số suy nghĩ về lý do chuyển đổi unboxing từ int được đóng hộp thành số thập phân không được mở hộp không hoạt động, hãy xem http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx để biết chi tiết . –

+0

@Eric: Tôi quên rằng 'Cast' nằm trên' IEnumerable' (và do đó các đối tượng) thay vì 'IEnumerable ' - do đó đó là chuyển đổi unboxing thay vì chuyển đổi giữa hai loại giá trị. (Không phải là một diễn viên thẳng sẽ làm việc trong trường hợp đó). Tâm trí bạn, tôi có thể * không bao giờ * tìm thấy bài viết mà bạn giải thích về những gì 'Cast' được sử dụng để làm (trước SP1). –

3

Truyền không chuyển đổi.

Khi bạn sử dụng phương pháp mở rộng Truyền, phương pháp này đang cố gắng truyền một mục dựa trên lược đồ kế thừa. Vì int không lấy được từ thập phân, bạn không thể thực hiện việc này bằng Cast. Hãy thử các cách sau để thay thế:

(new[] {1,2,3}).Select(x => (decimal)X); 
Các vấn đề liên quan