diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs index a6454ee6f79..12c7fea1699 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/src/TypeFactory.cs @@ -51,7 +51,7 @@ protected internal TypeFactory() } type = CreateCSharpTypeCore(inputType); - TypeCache.Add(inputType, type); + TypeCache[inputType] = type; return type; } diff --git a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs index 557d08a7a7f..174c1c24eb2 100644 --- a/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs +++ b/packages/http-client-csharp/generator/Microsoft.TypeSpec.Generator/test/TypeFactoryTests.cs @@ -283,6 +283,30 @@ public void CreateEnum_ExtensibleEnumWithoutVisitorsOrCustomCode_ReturnsExtensib Assert.IsTrue(enumProvider!.IsExtensible); } + [Test] + public void CreateCSharpType_SelfReferencingModel_DoesNotThrow() + { + var selfRefModel = InputFactory.Model("QueryFilter"); + var isReentrant = false; + + MockHelpers.LoadMockGenerator(createCSharpTypeCore: (InputType inputType) => + { + if (inputType == selfRefModel && !isReentrant) + { + isReentrant = true; + // Simulate the re-entrant call that occurs with self-referencing models + // (e.g., QueryFilter with property and: QueryFilter[]). + // CreateCSharpTypeCore -> CreateModel -> BuildProperties -> CreateCSharpType(same model) + CodeModelGenerator.Instance.TypeFactory.CreateCSharpType(selfRefModel); + } + return typeof(object); + }); + + // Before the fix, this would throw ArgumentException: + // "An item with the same key has already been added" + Assert.DoesNotThrow(() => CodeModelGenerator.Instance.TypeFactory.CreateCSharpType(selfRefModel)); + } + /// /// Test visitor that modifies enum namespaces to end with ".Models" ///