Those 4 lines create a managed array of integers (System::Int32 value type). I prefer the syntax of the first version but I would understand people using the 4th:

 

Int32 mai[]         = new Int32[2] ;

Int32 mai_1 __gc [] = new Int32[2] ;

Int32 mai_2[]       = __gc new Int32[2] ;

int   mai_3 __gc [] = new int __gc [2] ;

 

The 4th does require the __gc on each side. They are compiled to the same IL:

 

IL_0043:  ldc.i4.2

IL_0044:  newarr     [mscorlib]System.Int32

IL_0049:  stloc.s    V_5

IL_004b:  ldloc.s    V_5

IL_004d:  call       instance void [mscorlib]System.Array::Initialize()

IL_0052:  ldloc.s    V_5

IL_0054:  stloc.s    mai

 

The following line creates a native array of integers:

 

int * nativeArrayOfInt = new int[2] ;

delete nativeArrayOfInt ;

  

Of course, it produces quite different IL:

 

IL_0073:  ldc.i4.8

IL_0074:  call void * modopt( [mscorlib] System.Runtime.CompilerServices.CallConvCdecl ) 'new[]' ( unsigned int32 )

IL_0079:  stloc.s    nativeArrayOfInt

 

You cannot create a managed array of System::Void structures even by inserting __gc all over the places ;-)

 

System::Void arrayOfVoidManagedPointer __gc [] = __gc new System::Void __gc [2] ; // Error

 

By the way, the Void Structure documentation says "This structure has no members, and you cannot create an instance of this structure.” .

Well, it does have a Void Members link. I reported the bug even if I might be missing the point.

 

For all practical purpose, "System::Object *" is the managed version of the native "void *"

 

À bientôt / Hasta el rato / 'til next time.