dotnet/BenchmarkDotNet · error · NotSupportedException

AsyncMethodBuilder {builderType.GetDisplayName()} has generi

Error message

AsyncMethodBuilder {builderType.GetDisplayName()} has generic arity greater than 1.

What it means

The InProcess emitter supports AsyncMethodBuilder types with generic arity 0 or 1 only; builders with more than one generic parameter cannot be emitted.

Source

Thrown at src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/AsyncCoreEmitterBase.cs:144

                {
                    return typeof(AsyncTaskMethodBuilder);
                }
                if (asyncType.IsGenericType && asyncType.GetGenericTypeDefinition() == typeof(Task<>))
                {
                    return typeof(AsyncTaskMethodBuilder<>).MakeGenericType([asyncType.GetGenericArguments()[0]]);
                }
                throw new NotSupportedException($"AsyncMethodBuilderAttribute not found on type {asyncType.GetDisplayName()} from {Descriptor.DisplayInfo}");
            }

            static Type GetConcreteBuilderType(Type builderType, Type forReturnType)
            {
                if (!builderType.IsGenericTypeDefinition)
                {
                    return builderType;
                }
                if (builderType.GetGenericArguments().Length != 1)
                {
                    throw new NotSupportedException($"AsyncMethodBuilder {builderType.GetDisplayName()} has generic arity greater than 1.");
                }
                var resultType = forReturnType
                    .GetMethod(nameof(Task.GetAwaiter), BindingFlags.Public | BindingFlags.Instance)!
                    .ReturnType
                    .GetMethod(nameof(TaskAwaiter.GetResult), BindingFlags.Public | BindingFlags.Instance)!
                    .ReturnType;
                return builderType.MakeGenericType([resultType]);
            }
        }

        private void EmitOverhead()
        {
            var noUnrollMethod = EmitOverheadNoUnrollMethod();
            EmitOverheadUnrollMethod(noUnrollMethod);
        }

        private MethodInfo EmitOverheadNoUnrollMethod()
        {

View on GitHub (pinned to b515068b61)

Solutions

  1. Use an async method builder with at most one generic type parameter (e.g. AsyncTaskMethodBuilder or AsyncTaskMethodBuilder<T>).
  2. If you authored a custom builder, reduce its generic arity to 0 or 1.

When it happens

Trigger: Thrown at src/BenchmarkDotNet/Toolchains/InProcess/Emit/Implementation/Emitters/AsyncCoreEmitterBase.cs:144 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of dotnet/BenchmarkDotNet@b515068b61 (2026-08-13). Data as JSON: /api/errors/c60cbb4ce4cebc1b. Report an issue: GitHub.