From 7a5a2a00a9fcd5f002d3b28801d68b8e2e1b5ccb Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Thu, 13 Nov 2025 08:37:48 +0100 Subject: [PATCH] #3452: Transform field initializers in structs only if no record and no primary ctor. --- .../TransformFieldAndConstructorInitializers.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs b/ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs index de3b59496..1417ec9f6 100644 --- a/ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs +++ b/ICSharpCode.Decompiler/CSharp/Transforms/TransformFieldAndConstructorInitializers.cs @@ -50,7 +50,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms { // If we're viewing some set of members (fields are direct children of SyntaxTree), // we also need to handle those: - HandleInstanceFieldInitializers(node.Children, context.CurrentTypeDefinition); + HandleInstanceFieldInitializers(node.Children, null, context.CurrentTypeDefinition); HandleStaticFieldInitializers(node.Children, context.CurrentTypeDefinition); node.AcceptVisitor(this); @@ -173,7 +173,7 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms var currentTypeDefinition = (ITypeDefinition)typeDeclaration.GetSymbol(); // Handle initializers on instance fields - HandleInstanceFieldInitializers(typeDeclaration.Members, currentTypeDefinition); + HandleInstanceFieldInitializers(typeDeclaration.Members, typeDeclaration, currentTypeDefinition); // Now convert base constructor calls to initializers: base.VisitTypeDeclaration(typeDeclaration); @@ -200,10 +200,11 @@ namespace ICSharpCode.Decompiler.CSharp.Transforms return true; } - void HandleInstanceFieldInitializers(IEnumerable members, ITypeDefinition currentTypeDefinition) + void HandleInstanceFieldInitializers(IEnumerable members, EntityDeclaration entityDeclaration, ITypeDefinition currentTypeDefinition) { - if (currentTypeDefinition is { Kind: TypeKind.Struct, IsRecord: false } - && !context.Settings.StructDefaultConstructorsAndFieldInitializers) + if (!context.Settings.StructDefaultConstructorsAndFieldInitializers + && currentTypeDefinition is { Kind: TypeKind.Struct, IsRecord: false } + && entityDeclaration is TypeDeclaration { HasPrimaryConstructor: false }) { return; }