2010-04-16 8 views

Antwort

17

Nein, es befindet sich nicht in einem nicht typisierten Objekt. Für jeden Werttyp gibt es in der CLR einen Boxed-Referenztyp. So müßten Sie etwas wie:

public class BoxedInt32 // Not the actual name 
{ 
    private readonly int value; 
    public BoxedInt32(int value) 
    { 
     this.value = value; 
    } 
} 

Die boxed Typ nicht direkt in C#, obwohl es in C++/CLI ist. Offensichtlich kennt das den ursprünglichen Typ. In C# müssen Sie also einen Kompilierungszeittyp von object für die Variable haben, aber das bedeutet nicht, dass dies der tatsächliche Typ des Objekts ist. Weitere Informationen finden Sie unter ECMA CLI spec oder CLR via C#.

+0

Intersting, dank Jon. Wagners Effektives C# besagt: "Boxen platziert einen Werttyp in ein nicht typisiertes Bezugsobjekt". Ich bin mir ziemlich sicher, dass es auch etwas zu dem Effekt sagt, dass Boxed-Objekte keine Typ-Metadaten enthalten, obwohl ich dieses spezielle Zitat gerade nicht finden kann. Beim Lesen dieses Buches kam mir die Frage. – fearofawhackplanet

+0

@fearofawhackplanet: Ich möchte Bill nicht in die Quere kommen, was genau er damit meint - aber das Box-Objekt kennt definitiv seinen ursprünglichen Typ, einschließlich Enums. (Box einen Enum-Wert und dann ToString direkt ohne Entpacken für den Beweis :) –

+1

Ich glaube, eine gute Demonstration ist das. 'lang l = 40L; Objekt o = (Objekt) l; Console.WriteLine (o.GetType()); 'In diesem Fall wird System.Int64 auf dem Bildschirm gedruckt. Auch wenn "o" ein Objekt ist, ist der zugrunde liegende Typ immer noch lang. –

6

Jon Skeets Antwort deckt das Warum ab; wie für die, wie Sie es umgehen können, hier ist, was Sie tun müssen:

long l = 1; 
object obj = (object)l; 
double d = (double)(long)obj; 

Der Grund für die Dual-Besetzung ist dies; Wenn .NET die Variable entpackt, weiß es nur, wie man es aus dem Kasten herausnimmt (long in Ihrem Beispiel). Sobald Sie es entpackt haben und Sie ein richtiges long Grundelement haben, können Sie es dann auf double oder umwandeln jeder andere Typ gießbar aus long.