Tại sao thực hiện điều này:.net Rắc rối đúc ints làm thập phân
(new[]{1,2,3}).Cast<decimal>();
kết quả trong một
InvalidCastException: Được chỉ định dàn diễn viên là không hợp lệ.
Tại sao thực hiện điều này:.net Rắc rối đúc ints làm thập phân
(new[]{1,2,3}).Cast<decimal>();
kết quả trong một
InvalidCastException: Được chỉ định dàn diễn viên là không hợp lệ.
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.
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);
Bạn đang quá nhanh. :) –
Để 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 . –
@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). –