2011-12-08 9 views
5

Spróbuj czegoś z widokiem, ale ten problem bardzo mnie zirytował. Próbuję pobrać wartość z zestawu danych, a następnie użyć jej do wykonania pewnych obliczeń. w zbiorze danych, który jest postrzegany jako obiekt, więc muszę go przesłać do int lub podwójnego. Z jakiegoś powodu dostaję głupi błąd, który działa mi na nerwy. Oto kod.C# cast error (infinte value .... what?)

private void SpendsAnalysis() 
    { 
     float tempQty = 0; 
     float tempPrice = 0; 
     double tempTot = 0; 
     double total = 0; 

     foreach (DataGridViewRow row in dataGridView1.Rows) 
     { 
      tempQty = (float)row.Cells["Qty"].Value; 
      tempPrice = (float)row.Cells["Unit"].Value; 

      tempTot = tempQty * tempPrice; 
      total += tempTot; 
     } 

     textBox7.Text = total.ToString(); 
    } 

Generowany: "Określony rzut nie jest prawidłowy." (System.InvalidCastException) podczas przesyłania formularza liczba musi być mniejsza niż nieoficjalność. To jest irytujący błąd, który dostaję. teraz otrzymuję dane z mojego zbioru danych, który pobiera dane z procedury składowanej. Wierzę, że typ pola "Qty" to waluta (yeh, dlaczego jest qty waluta haha, nie moje tabele!). w moim widoku datagrid wygląda na 1.000, czy to ze względu na konwersję typu? jak to naprawić? Wielkie dzięki z góry!

+4

'float' jest na pewno gorsze niż mecz' currency' lub 'po przecinku '. Ale brzmisz jak powinna być liczbą całkowitą. Każde 'float' /' double' występujące w kalkulacji pieniężnej jest dużą czerwoną flagą. – CodesInChaos

+0

Zgadzam się, ale są to wartości ustawione przez oryginalną tabelę. rzucam ją do wartości, z którą mogę pracować, ither double lub float – lemunk

+0

A dlaczego nie "Decimal"? Możesz użyć wartości dziesiętnej w języku C# i jest to z pewnością lepszy wybór niż opcja 'float' lub' double'. – CodesInChaos

Odpowiedz

9

typ obsada ma odnieść sukces, i niestety, rzucając bezpośrednio z object do innego typu niż bazowego obiektu nie będzie działać, nawet jeśli odlewania z decimal (typu NET currency) do float normalnie by działało.

Jeśli typ w bazie danych jest currency, chciałbym spróbować to:

= (float)(decimal)row.Cells["Qty"].Value; 

lub można użyć this:

= Convert.ToSingle(row.Cells["Qty"].Value); 

który będzie przyjrzeć się aktualnej wartości i figury odpowiedni typ konwersji do wykonania.

Aby odpowiedzieć na komentarz, powyższe wyrażenie obejmuje dwa odrębne konwersji:

  • unboxing konwersja z object do typu wartości, w tym przypadku do decimal
  • Wyraźne konwersja z decimal do float

Pierwsza konwersja rozpakowywania jest udokumentowana w sekcji specyfikacji języka C# 4.3.2 (jest to C# 4.0 specification)

Unboxing operacja non wartości pustych-wartość typu obejmuje sprawdzenie najpierw, że instancja obiektu jest pudełkowym wartości danej dla wartości pustych-wartość typu, i kopiowanie wartości z instancji.

(podkreślenie moje)

Mam też uwagami wersją specyfikacji i Eric Lippert podsumowuje to tak:

Chociaż jest to legalne przekonwertować unboxed int do unboxed double, nie jest legalne konwertowanie pudełkowej int na unboxed double-only na unboxed int.

Drugi wyraźne konwersji jest opisany w C# specyfikacji język sekcji 6.2.1:

6.2.1 Wyraźne numeryczne konwersji
Jednoznaczne konwersji numeryczne się konwersji w typ numeryczny do innego typu numerycznego, dla którego nie istnieje już domyślna konwersja liczbowa (§6.1.2):
...
Od dziesiętna do sbyte, bajt e, krótki, ushort, int, uint, long, ulong, char, float lub podwójny.

(ponownie, moje podkreślenie)

Podsumowując:

  • Kiedy "odlew" z object do typu wartości, jesteś rzeczywiście unboxing wartość pudełkowej, a najpierw musisz rozpakować rzeczywistą wartość bazową na jej poprawny typ, zanim będzie można przekonwertować ją na inny typ.
+0

hmmmmm ciekawe – lemunk

+0

ah wiele dzięki convert.tosingle działa traktować, więc to fakt, że jest to obiekt, który oznacza, że ​​nie można przekonwertować? czy są tam już informacje? – lemunk

+3

Powiedziawszy wszystko, co chciałem powiedzieć w mojej odpowiedzi, jesteś pewna, że ​​* chcesz * to jako 'float', a nie jako' dziesiętny'? –