2014-05-07 20 views
5

byłem roaming w różnych miejscach do odlewania techniki i skonstruowane poniższy kod, żeby rzucić się z float do int jak pokazano poniżejZapytanie LINQ zgłasza wyjątek 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()); 

Ale powyższy kod wygeneruje InvalidCastException. Dlaczego to? Myślałem, że ma wydrukować 3,3 i 4.

Odpowiedz

14

LINQ klauzula postaci:

from X x in y 

jest równoważna

y.Cast<X>() 

a następnie za pomocą x jako zmienna zakresu później. Reszta zapytaniu jest zdegenerowany, więc kod jest równoważny:

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

Teraz Enumerable.Cast() ma nie zrobić konwersje tak - to tylko robi konwersje referencyjnych i boks/unboxing konwersji. Dla innych konwersji, trzeba Select:

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

Lub jeśli naprawdę użyć wyrażenia kwerendy:

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

... ale osobiście dla prostych zapytań tak, ja nie będzie użyj wyrażenia zapytania - po prostu użyłbym metody, jak pokazano powyżej.

+0

+1 za bycie bardzo wnikliwym w to, co się dzieje. –

+0

thanx za udzielenie odpowiedzi Jonowi i tak, chciałbym przejść do prostego zapytania .. i jaka powinna być odpowiedź tutaj: - 2,3,4 lub 3,3,4? – Neel

+0

@Neel, myślę, że chcesz zaokrąglić, zamiast rzucać w prawo? W takim przypadku możesz użyć 'var intList = floatList.Select (x => (int) Math.Round (x));' –

5

To dlatego, że nie są int sw floats i int i jesteś określając szukać int s, powodując wewnętrzne obsady że nie działa (jak int i = 2.7f;).

myślę, że to byłby sposób to działa:

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

thanx za udzielenie odpowiedzi :) – Neel

Powiązane problemy