Summary
The UdonSharp compiler compiles
T[]
declarations inside generic methods to an incorrect array type instead of the array type corresponding to the type argument.
This issue occurs when
T[]
is used only within the method body and does not appear in the method's return type or parameters.
Steps to Reproduce
  1. Create a UdonSharp script using the code below.
  2. Compile the script and inspect the generated Udon assembly, focusing on the code corresponding to each generic method invocation.
Expected Result
The array type should correspond to the specified type argument:
  • GenericMethod<int>()
    :
    SystemInt32Array
  • GenericMethod<float>()
    :
    SystemSingleArray
  • GenericMethod<string>()
    :
    SystemStringArray
Actual Result
SystemInt32Array
is used for all invocations. The corresponding array types for
float[]
and
string[]
are not generated.
Reproduction Code
using UdonSharp;
public class GenericsArrayTypeBug : UdonSharpBehaviour
{
void Start()
{
GenericMethod<int>();
GenericMethod<float>();
GenericMethod<string>();
}
public static void GenericMethod<T>()
{
T[] array = new T[0];
}
}
Generated Udon Assembly
With SDK 3.10.5, the generated assembly uses
SystemInt32Array
for all three invocations, as shown in the following variable declarations:
__lcl_array_SystemInt32Array_0: %SystemInt32Array, null
__lcl_array_SystemInt32Array_1: %SystemInt32Array, null
__lcl_array_SystemInt32Array_2: %SystemInt32Array, null
The array constructor calls also use
SystemInt32Array
in all three cases:
EXTERN, "SystemInt32Array.__ctor__SystemInt32__SystemInt32Array"
Therefore, even when
float
or
string
is specified as the type argument, the array is compiled as the equivalent of
int[]
.
Additional Observation
When
T[]
is included in the method's return type or parameters, this issue does not occur, and the array type is generated correctly.
Environment
  • VRChat Worlds SDK: 3.10.5
  • Unity: 2022.3.22f1