Warum bekomme ich InvalidCastException, wenn ich ein Double to Decimal umwandle

7

Ich versuche, eine Anwendung zu debuggen, die eine InvalidCastException erhält. Die fehlerhafte Zeile ist

%Vor%

Wenn Sie dies im Debugger überprüfen (siehe Abbildung unten), enthält Zeile [Nenner] ein Double mit dem Wert 8.0, soweit ich das beurteilen kann. Surely sollte es kein Problem geben, das auf eine Dezimalzahl zu werfen?

(Der Typ "row" stammt von 3. Party-Bibliothek ) , die wiederum aus Daten von MySQL gefüllt ist. Das Problem tauchte beim Testen gegen einen älteren MySQL-Server auf, der anscheinend einige Aggregate als doppelt vs dezimal auf MySQL 5.1 zurückgibt - dieselbe Abfrage, genau dieselbe Kopie der Daten in der Datenbank.

Visual Studio-Screenshot http://img18.imageshack.us/img18/3897/invaldicast.png

Irgendwelche Hilfe, wie ich das weiter untersuchen könnte?

    
Anonym 03.11.2009, 12:54
quelle

8 Antworten

10

Eric Lippert hat genau darüber ausführlich gebloggt. Ich stimme zu, dass es anfangs nicht intuitiv ist, aber er erklärt es gut: Repräsentation und Identität

>     
SoftMemes 03.11.2009, 13:21
quelle
6

Sie müssen es zuerst doppelt darstellen, da row[denominator] eine doppelte Box als Objekt ist d. h.

%Vor%     
JDunkerley 03.11.2009 12:59
quelle
4

Ich würde es versuchen

%Vor%

oder

%Vor%     
Viktor Jevdokimov 03.11.2009 13:00
quelle
3

Sie können verwenden:

%Vor%

Oder kürzen Sie das natürlich auf:

%Vor%

Da ein Unboxing-Schritt erforderlich ist, benötigen Sie 2 Schritte.

    
Henk Holterman 03.11.2009 12:59
quelle
3

Ein Vorschlag: Verwenden Sie Convert.ToDecimal () anstelle des direkten Castings.

    
Audrius 03.11.2009 13:00
quelle
2

Probieren Sie es zuerst in double . Das row[denominator] ist eingerahmt, daher funktioniert eine direkte Umwandlung in decimal nicht.

    
Trumpi 03.11.2009 12:59
quelle
2

Ausgehend von der Fehlermeldung und der Beschreibung gehe ich davon aus, dass die Zeile [Nenner] eine doppelte Box ist, also vom Typ Objekt. Das Unboxing kann nur mit dem richtigen Dateityp durchgeführt werden, da die Laufzeit nicht mehr den tatsächlichen Konvertierungsoperator von Double zu Decimal findet (in Ihrem Fall wird versucht, einen Operator zu finden, der das Objekt in Dezimal konvertiert, aber das ist ein Unboxing-Operator und der zugrunde liegende Typ ist nicht dezimal. Also sollte der richtige Weg sein, zuerst in Doppel und dann in Dezimal zu konvertieren:

%Vor%     
Grizzly 03.11.2009 13:02
quelle
0

tu es einfach

%Vor%

Auf diese Weise müssen Sie sich nicht um alle Casting-Probleme kümmern.

    
assassin 13.03.2014 23:59
quelle

Tags und Links