dotnet/runtime

EnumBuilder.UnderlyingSystemType != EnumBuilder.CreateType().UnderlyingSystemType

Open

#110,924 建立於 2024年12月24日

在 GitHub 查看
 (6 留言) (0 反應) (0 負責人)C# (5,445 fork)batch import
area-System.Reflection.Emitbreaking-changebughelp wanted

倉庫指標

Star
 (17,886 star)
PR 合併指標
 (平均合併 12天 11小時) (30 天內合併 661 個 PR)

描述

Description

When creating an enumeration via the DefineEnum on the ModuleBuilder, the emitted type's UnderlyingSystemType is set to the type being emitted (creating a circular reference path). It should be set to the provided type.

Reproduction Steps

ModuleBuilder _moduleBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("Test"), AssemblyBuilderAccess.RunAndCollect).DefineDynamicModule("Test");

EnumBuilder builder = _moduleBuilder.DefineEnum("E_Test", TypeAttributes.Public, typeof(int));

builder.DefineLiteral("Low", 0); builder.DefineLiteral("High", 1);

Type type = builder.CreateType();

if (type.UnderlyingSystemType == type) { throw new Exception("Circular reference"); } else if (type.UnderlyingSystemType != builder.UnderlyingSystemType) { throw new Exception("This should never throw"); }

Expected behavior

Emitted type has the underlying type set to the type defined in the DefineEnum call ("Circular reference" exception will be thrown)

Actual behavior

Emitted type has the underlying type set to itself

Regression?

No response

Known Workarounds

No response

Configuration

.Net version: .Net 8.0.11 OS: Windows 11, latest updates applied Arch: x64

System.Reflection: 4.3.0

Other information

No response

貢獻者指南