diff --git a/packages/http-client-csharp/emitter/src/lib/type-converter.ts b/packages/http-client-csharp/emitter/src/lib/type-converter.ts index ded35eb85e8..23d9346badb 100644 --- a/packages/http-client-csharp/emitter/src/lib/type-converter.ts +++ b/packages/http-client-csharp/emitter/src/lib/type-converter.ts @@ -118,12 +118,18 @@ export function fromSdkType( typeof sdkProperty.serializedName === "string" && sdkProperty.serializedName.toLocaleLowerCase() === "content-type"; + // Check if the original property type was an enum (e.g., when @alternateType collapses + // a single-member enum to a constant) - preserve the enum type in this case + const isOriginalTypeEnum = + sdkProperty !== undefined && sdkProperty.__raw?.type?.kind === "Enum"; + if ( sdkProperty && !isContentTypeHeader && - (sdkProperty.optional || sdkProperty?.type.kind === "nullable") && - sdkProperty?.type.kind !== "boolean" && - sdkType.valueType.kind !== "boolean" + (((sdkProperty.optional || sdkProperty?.type.kind === "nullable") && + sdkProperty?.type.kind !== "boolean" && + sdkType.valueType.kind !== "boolean") || + isOriginalTypeEnum) ) { // turn the constant into an extensible enum retVar = diagnostics.pipe(createEnumType(sdkContext, sdkType, namespace!)); diff --git a/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts b/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts index 3730f08dbdd..46f38ad8c1b 100644 --- a/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts +++ b/packages/http-client-csharp/emitter/test/Unit/constant-type.test.ts @@ -149,4 +149,34 @@ describe("Constant enum conversion", () => { strictEqual(enumType.access, undefined); strictEqual(enumType.usage, UsageFlags.Input | UsageFlags.Json); }); + + it("single-member enum with @alternateType should preserve enum type for required property", async () => { + const program = await typeSpecCompile( + ` + enum Colors { + green, + } + + model TestModel { + @alternateType("green") + prop: Colors; + } + + op test(@body input: TestModel): void; + `, + runner, + { IsTCGCNeeded: true }, + ); + const context = createEmitterContext(program); + const sdkContext = await createCSharpSdkContext(context); + const [root] = createModel(sdkContext); + const testModel = root.models.find((m) => m.name === "TestModel"); + ok(testModel); + const propertyType = testModel.properties[0].type; + strictEqual(propertyType.kind, "enum"); + const enumType = propertyType as InputEnumType; + strictEqual(enumType.isFixed, false); + strictEqual(enumType.values.length, 1); + strictEqual(enumType.values[0].value, "green"); + }); });