2010-10-17 10 views

Antwort

59

Ein Boxed-Wert kann nur auf eine Variable desselben Typs entpackt werden. Diese scheinbar merkwürdige Einschränkung ist eine sehr wichtige Geschwindigkeitsoptimierung, die .NET 1.x vor der Verfügbarkeit von Generika durchführbar machte. Sie können mehr darüber in this answer lesen.

Sie müssen nicht durch den Mehrfach-Castrahmen springen, einfache Werttypen implementieren die IConvertible-Schnittstelle. Die Sie aufrufen, indem Sie die Convert-Klasse:

 object o = 12m; 
     int ix = Convert.ToInt32(o); 
+0

Sehr süß! Ich habe mir seit dem Morgen den Kopf zerbrochen. – RBT

15

Wenn Sie das tun, sind Sie implizit das Dezimalsystem d auf ein Basisobjekt Boxen:

object o = d; 

Sie nicht boxed Werte direkt werfen können, ohne zuerst Unboxing sie, weshalb fehlschlägt direkt an ein int, wie folgt, im folgenden:

int x = (int)o; 

jedoch, indem Sie diese (intermediär in eine Dezimalzahl ersten Casting):

int x = (int)(decimal)o; 

Sie sind erste Unboxing o, was bedeutet, dass Sie den Dezimalwert abrufen, dann die unboxed Dezimalwert Gießen zu einem int, was funktioniert, weil C# das Versetzen von Dezimalzahlen in Ints unterstützt.

6

decimal hat eine explicit cast operator zu int. object nicht:

decimal d = 10m; 
object o = d; 
int x = (int)d; // OK, calls decimal.explicit operator int(d). 
int y = (int)o; // Invalid cast. 
3

Was brauchen Sie von hier zu denken, dass Boxen und Unboxing ist nicht gerade eine Art Konvertierung. Sie "wickeln" Sie den Objekttyp "um" den ursprünglichen Dezimaltyp herum. Deshalb müssen Sie zuerst das Objekt auspacken, bevor Sie es in eine Ganzzahl konvertieren können.

Verwandte Themen