Domanda

ho ricevuto il seguente codice:

object var3 = 3;
Console.WriteLine(var3.GetType().ToString());
Console.WriteLine(typeof(object).ToString());

L'output è:

System.Int32
System.Object

Perché non sono entrambi System.Object?

È stato utile?

Soluzione

Se stai chiedendo perché il boxedObject.GetType () non restituisce oggetto .. controllare l'immagine sotto la sezione 'Boxing conversione' sul MSDN Boxing e unboxing pagina . Bella domanda .. btw atleast la mia comprensione della tua domanda.

Anche se io non sia tecnicamente corretto, sembra che

  • Quando si trasferisce al mucchio, viene creato un nuovo oggetto - il suo puntatore Digitare set per oggetto Type del tipo di valore originale (qui System.Int32). Questo spiega GetType () (e anche l'errore se si tenta di unboxing in un tipo diverso).
  • Il valore attuale viene poi copiato in questo oggetto.

Altri suggerimenti

La funzione GetType() restituisce il tipo reale dell'istanza nella variabile.

Anche se la variabile è dichiarata come object, in realtà è tenendo un'istanza Int32 boxed.

Ignorando il tema della boxe, tutte le classi ereditano dal tipo di oggetto. Questo è vero per entrambi i tipi di riferimento e tipi di valore. GetType mostra il tipo più derivato, che in questo caso è System.Int32.

Una delle poche volte GetType sta per tornare System.Object è se si fa questo:

object var = new Object();
Console.WriteLine(var.GetType().ToString());

inscatolamento riferisce a quando un tipo di valore viene puntato da un tipo di riferimento. In genere questo viene fatto come riferimento System.Object. TypeOf restituirà il tipo effettivo più derivato, non il tipo di riferimento.

class A
{
}

class B : A
{
}

class C : B
{
}

object obj1 = new ClassA();
ClassB obj2 = new ClassB();
ClassB obj3 = new ClassC();

GetType farà fare cose simili per questi tipi.

System.Console.WriteLine(obj1.GetType().ToString());
System.Console.WriteLine(obj2.GetType().ToString());
System.Console.WriteLine(obj3.GetType().ToString());
  

ClasseA
ClassB
ClassC

Questa non è realmente di boxe; questo è circa il comportamento dei GetType. Restituisce il tipo di Valore della variabile, non il tipo della variabile è stato ha dichiarato con:

    object var4 = new List<string>();
    Console.WriteLine(var4.GetType().ToString());

non tornerà System.Object sia.

dichiarazioni di variabile è momento della compilazione solo informazioni che metodo di esecuzione è runtime. In altre parole, non c'è modo GetType () può sapere che tipo l'oggetto è stato dichiarato come si può conoscere solo il tipo effettivo dell'oggetto in fase di esecuzione.

simile se si ha

class a
{
}

class b : a

a bInstance = new b();
bInstance.GetType();

la chiamata a bInstance.GetType () non hanno alcun modo di sapere che la variabile è stata dichiarata come tipo 'a' e non credo che ci si aspetta per tornare 'a' in questo caso neanche. Tuttavia nell'esempio di cui sopra è il mio un abbreviazione di oggetto e B è per System.Int32

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top