FinalFantasy hat folgendes geschrieben: |
Dass der JIT Compiler jedoch versucht einen Double zu lesen, wo aber ein Int steht und deshalb ja eigentlich gar keinen Cast macht, zeigt mir leider kein Debugger. |
Der Grund warum es knallt steht eigentlich schon oben. Für andere Leser nochmal im Klartext:
Ein "hard cast" [meta](Type)variable -> (Button)someControl; (IList)someCollection[/meta] versucht eine Umwandlung, ist keine Umwandlung möglich[meta]kein Operator für explizite/implizite Umwandlung vorhanden[/meta] -> wird null ausgespuckt.
Ein value type kann nicht null sein -> *kabumm*
Aber "safe cast" [meta]variable as Type -> someControl as Button; someCollection as IList;...[/meta] ist nicht auf value types anwendbar...
Deshalb hast du nur wenige Möglichkeiten:
C#-Quelltext
C#-Quelltext
1: 2: 3:
| IConvertible convertible = d as IConvertible; double myDouble = convertible.ToDouble(NumberFormatInfo.CurrentInfo); |
C#-Quelltext
1:
| double myDouble = Convert.ToDouble(d); |
C#-Quelltext
1:
| double MyDouble = Convert.ChangeType(d, typeof(double)); |
Die performanteste und einfachste Lösung wäre es, den Wert nie in eine Box (Object) zu stecken.
Generics sind genau dafür da (und natürlich um Schreibkram einzusparen).
Oder einfach so selten wie möglich einzelne value types umherschubsen. Kannst du mehrere zu einer Klasse bündeln hast du alle Vorteile von reference types[meta]und Ordnung[/meta].
Wobei value types wiederum durch den JIT besser optimiert werden können...