From 231339add39070413a62d36581f2a264c9b4b32a Mon Sep 17 00:00:00 2001 From: Katy Coe Date: Mon, 2 Dec 2019 08:12:12 +0100 Subject: [PATCH] Output: Parameterized struct constructors must call parameterless constructor (CS0843) --- Il2CppDumper/Il2CppCSharpDumper.cs | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/Il2CppDumper/Il2CppCSharpDumper.cs b/Il2CppDumper/Il2CppCSharpDumper.cs index 3f528ba..9cc16dc 100644 --- a/Il2CppDumper/Il2CppCSharpDumper.cs +++ b/Il2CppDumper/Il2CppCSharpDumper.cs @@ -336,16 +336,27 @@ namespace Il2CppInspector sb.Append($"{prefix}\t{method.GetModifierString()}{method.DeclaringType.UnmangledBaseName}{method.GetTypeParametersString(scope)}"); sb.Append($"({method.GetParametersString(scope, !SuppressMetadata)})"); + // Class constructor if (method.IsAbstract) sb.Append(";"); - else if (!type.IsValueType || !fields.Any()) + else if (!type.IsValueType) sb.Append(" {}"); - // Struct constructors must initialize all fields in the struct + + // Struct constructor else { - var paramNames = method.DeclaredParameters.Select(p => p.Name); - sb.Append(" {\n" + string.Join("\n", - fields.Select(f => $"{prefix}\t\t{(paramNames.Contains(f.Name) ? "this." : "")}{f.Name} = default;")) - + $"\n{prefix}\t}}"); + // Parameterized struct constructors must call the parameterless constructor to create the object + // if the object has any auto-implemented properties + if (type.DeclaredProperties.Any() && method.DeclaredParameters.Any()) + sb.Append(" : this()"); + + // Struct construvctors must initialize all fields in the struct + if (fields.Any()) { + var paramNames = method.DeclaredParameters.Select(p => p.Name); + sb.Append(" {\n" + string.Join("\n", + fields.Select(f => $"{prefix}\t\t{(paramNames.Contains(f.Name) ? "this." : "")}{f.Name} = default;")) + + $"\n{prefix}\t}}"); + } else + sb.Append(" {}"); } sb.Append((!SuppressMetadata && method.VirtualAddress != null ? $" // {method.VirtualAddress.ToAddressString()}" : "") + "\n");