-
Notifications
You must be signed in to change notification settings - Fork 5.3k
Description
Description
Certain System.Reflection.Emit (SRE) subclasses of Type appear to be missing an implementation for the Type.IsByRefLike property. When queried, a NotSupportedException ("Derived classes must provide an implementation") gets thrown when they should probably just return false.
I've so far found two such types that both seem to involve generics: System.Reflection.Emit.TypeBuilderInstantiation and System.Reflection.Emit.SymbolType.
Could it be that these two types were overlooked back in #34846?
Reproduction Steps
Here is one code example that reproduces the problem for System.Reflection.Emit.TypeBuilderInstantiation:
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("A"), AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("A");
var genericTypeBuilder = moduleBuilder.DefineType("C", TypeAttributes.Class);
_ = genericTypeBuilder.DefineGenericParameters("T");
var closedGenericTypeBuilder = genericTypeBuilder.MakeGenericType(typeof(object));
Console.WriteLine(closedGenericTypeBuilder.GetType().FullName);
Console.WriteLine(closedGenericTypeBuilder.IsByRefLike);(I haven't yet been able to create a short code repro for System.Reflection.Emit.SymbolType, but will add one if I can figure it out.)
Expected behavior
Prints the following to the console:
System.Reflection.Emit.TypeBuilderInstantiation
False
Actual behavior
Prints the following to the console:
System.Reflection.Emit.TypeBuilderInstantiation
Unhandled exception. System.NotSupportedException: Derived classes must provide an implementation.
at System.Type.get_IsByRefLike()
at Program.Main ...
The exception is caused by the IsByRefLike query in the last line of code.
Regression?
I don't think this is a regression, since the same error also occurs on older .NET runtimes (e. g. .NET Core 3.1). It appears like this simply hasn't been implemented yet at all.
Known Workarounds
I don't know of any workaround short of wrapping IsByRefLike queries in an extension method that catches the exception and converts it to false, then calling that extension method instead of using IsByRefLike directly:
static bool IsByRefLikeSafe(this Type type)
{
try
{
return type.IsByRefLike;
}
catch (NotSupportedException)
{
return false;
}
}Configuration
- I've run the code repro on the following runtimes:
- .NET Core 3.1
- .NET 6
- .NET 7
- OS: Windows 11 Pro (22H2), build 22621.2134
- Architecture: x64
Other information
No response