From e8f32ec5921f4e805b710ef58f7112486d1128ab Mon Sep 17 00:00:00 2001 From: sonyps5201314 Date: Wed, 15 Oct 2025 15:07:22 +0800 Subject: [PATCH] Fixed the issue where IsPrimaryConstructor's judgment was too conservative, which resulted in the inability to generate correct code in many scenarios. --- .../CSharp/RecordDecompiler.cs | 20 +++++-------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs b/ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs index c14cf4286..7a51c1c35 100644 --- a/ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs +++ b/ICSharpCode.Decompiler/CSharp/RecordDecompiler.cs @@ -198,25 +198,12 @@ namespace ICSharpCode.Decompiler.CSharp if (method.Parameters.Count == 0) return false; - var addonInst = isStruct ? 1 : 2; - if (body.Instructions.Count < method.Parameters.Count + addonInst) - return false; - for (int i = 0; i < method.Parameters.Count; i++) { if (!body.Instructions[i].MatchStFld(out var target, out var field, out var valueInst)) - return false; + break; if (!target.MatchLdThis()) return false; - if (method.Parameters[i].ReferenceKind is ReferenceKind.In or ReferenceKind.RefReadOnly) - { - if (!valueInst.MatchLdObj(out valueInst, out _)) - return false; - } - if (!valueInst.MatchLdLoc(out var value)) - return false; - if (!(value.Kind == VariableKind.Parameter && value.Index == i)) - return false; IMember backingMember; if (backingFieldToAutoProperty.TryGetValue(field, out var property)) { @@ -379,7 +366,10 @@ namespace ICSharpCode.Decompiler.CSharp internal (IProperty prop, IField field) GetPropertyInfoByPrimaryConstructorParameter(IParameter parameter) { - var member = primaryCtorParameterToAutoPropertyOrBackingField[parameter]; + if (!primaryCtorParameterToAutoPropertyOrBackingField.TryGetValue(parameter, out var member)) + { + return (null, null); + } if (member is IField field) return (null, field); return ((IProperty)member, autoPropertyToBackingField[(IProperty)member]);