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?
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
> Sie müssen es zuerst doppelt darstellen, da row[denominator]
eine doppelte Box als Objekt ist
d. h.
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.
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%