2010-03-02 11 views

Odpowiedz

11

Yup, Cast tego nie robi. Zasadniczo dotyczy to tylko konwersji i rozpakowywania konwersji - a nie konwersji między różnymi typami wartości.

Użyj tego zamiast:

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

Zauważ, że pre-.NET 3.5 SP1, Cast zrobił kilka więcej konwersji niż obecnie. Nie wiem od razu, czy to by zadziałało, czy nie, ale zdecydowanie nie teraz.

+1

Jesteś zbyt szybki. :) –

+0

Kilka uwag na temat tego, dlaczego rozpakowywanie konwersji od pudełkowej int do dziesiętnej nieskasowanej nie działa, zobacz http://blogs.msdn.com/ericlippert/archive/2009/03/19/representation-and-identity.aspx w celu uzyskania szczegółów . –

+0

@Eric: Ciągle zapominam, że 'Cast' jest na' IEnumerable' (a więc obiektach) zamiast 'IEnumerable ' - stąd dlaczego jest to konwersja unboxing, a nie konwersja między dwoma typami wartości. (Nie, żeby w tym przypadku działała prosta obsada). Pamiętaj, że mogę * nigdy * znaleźć stanowisko, w którym wyjaśnisz, co kiedyś robił Cast (przed SP1). –

3

Przesyłanie nie podlega konwersji.

Gdy używasz metody Cast, próbujesz rzucić element na podstawie schematu dziedziczenia. Ponieważ int nie pochodzi z dziesiętnych, nie można tego zrobić za pomocą Cast. Spróbuj zamiast tego:

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