Quantcast
Channel: Why is the C# compiler emitting a callvirt instruction for a GetType() method call? - Stack Overflow
Viewing full articles (6 articles)
Browse article index

Why is the C# compiler emitting a callvirt instruction for a GetType() method call?

$
0
0

I am curious to know why this is happening. Please read the code example below and the corresponding IL that was emitted in comments below each section:

using System;class Program{    static void Main()    {        Object o = new Object();        o.GetType();        // L_0001: newobj instance void [mscorlib]System.Object::.ctor()        // L_0006: stloc.0         // L_0007: ldloc.0         // L_0008: callvirt instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()        new Object().GetType();        // L_000e: newobj instance void [mscorlib]System.Object::.ctor()        // L_0013: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()    }}

Why did the compiler emit a callvirt for the first section but a call for the second section? Is there any reason that the compiler would ever emit a callvirt instruction for a non-virtual method? And if there are cases in which the compiler will emit a callvirt for a non-virtual method does this create problems for type-safety?


Viewing full articles (6 articles)
Browse article index

Latest Images

Trending Articles



Latest Images