Skip to content

C#14 Extensions: Bug/Issue With Expression Trees and/or Anonymous Classes #80092

@333fred

Description

@333fred

Discussed in #80091

Originally posted by LeQuackers August 29, 2025
Hi,

I was converting over some classic extension methods to the new C# 14 extension members, but I ran into an issue were one of the methods throw a BadImageFormatException HResult 0x8007000B, which was really strange.

Here's a watered down version of the method that caused it:

Pretty sure this isn't intended, so I'm leaving it here.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;

new[] { 1, 2, 3, 4, 5 }.AsQueryable().LeftJoin(
    new[] { 2, 4 }.AsQueryable(),
    x => x,
    x => x,
    (x, y) => new { x, y });

public static class Extensions
{
    extension<TLeft>(IQueryable<TLeft> left)
    {
        public IQueryable<TResult> LeftJoin<TRight, TKey, TResult>(
            IQueryable<TRight> right,
            Expression<Func<TLeft, TKey>> leftKeySelector,
            Expression<Func<TRight, TKey>> rightKeySelector,
            Expression<Func<TLeft, TRight, TResult>> resultSelector)
        {
            _ = left
                .GroupJoin(right, leftKeySelector, rightKeySelector, (left, right) => new { left, right })
                .SelectMany(x => x.right.DefaultIfEmpty(), (x, right) => new { x.left, right });
            
            return Array.Empty<TResult>().AsQueryable();
        }
    }
}
Stack
System.InvalidOperationException: This program location is thought to be unreachable. File='/_/src/Compilers/CSharp/Portable/Lowering/BoundTreeToDifferentEnclosingContextRewriter.cs' Line=184
   at Microsoft.CodeAnalysis.CSharp.BoundTreeToDifferentEnclosingContextRewriter.VisitPropertySymbol(PropertySymbol property)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodBodyRewriter.VisitPropertySymbol(PropertySymbol symbol)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitPropertyAccess(BoundPropertyAccess node)
   at Microsoft.CodeAnalysis.CSharp.BoundPropertyAccess.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[BoundExpression](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitList[BoundExpression](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodReferenceRewriter.<VisitCall>g__visitArgumentsAndFinishRewrite|3_0(BoundTreeRewriter rewriter, BoundCall node, BoundExpression rewrittenReceiver)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodReferenceRewriter.VisitCall(BoundTreeRewriter rewriter, BoundCall node)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodBodyRewriter.VisitCall(BoundCall node)
   at Microsoft.CodeAnalysis.CSharp.BoundCall.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitReturnStatement(BoundReturnStatement node)
   at Microsoft.CodeAnalysis.CSharp.BoundReturnStatement.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[BoundStatement](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitList[BoundStatement](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeToDifferentEnclosingContextRewriter.VisitBlock(BoundBlock node, Boolean removeInstrumentation)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeToDifferentEnclosingContextRewriter.VisitBlock(BoundBlock node)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodBodyRewriter.VisitBlock(BoundBlock node)
   at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodBodyRewriter.VisitLambda(BoundLambda node)
   at Microsoft.CodeAnalysis.CSharp.BoundLambda.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeToDifferentEnclosingContextRewriter.VisitConversion(BoundConversion node)
   at Microsoft.CodeAnalysis.CSharp.BoundConversion.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[BoundExpression](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitList[BoundExpression](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodReferenceRewriter.<VisitCall>g__visitArgumentsAndFinishRewrite|3_0(BoundTreeRewriter rewriter, BoundCall node, BoundExpression rewrittenReceiver)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodReferenceRewriter.VisitCall(BoundTreeRewriter rewriter, BoundCall node)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodBodyRewriter.VisitCall(BoundCall node)
   at Microsoft.CodeAnalysis.CSharp.BoundCall.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.VisitExpressionOrPatternWithoutStackGuard(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.VisitExpressionOrPatternWithStackGuard(Int32& recursionDepth, BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitExpressionStatement(BoundExpressionStatement node)
   at Microsoft.CodeAnalysis.CSharp.BoundExpressionStatement.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitSequencePoint(BoundSequencePoint node)
   at Microsoft.CodeAnalysis.CSharp.BoundSequencePoint.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.DoVisitList[BoundStatement](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriter.VisitList[BoundStatement](ImmutableArray`1 list)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeToDifferentEnclosingContextRewriter.VisitBlock(BoundBlock node, Boolean removeInstrumentation)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeToDifferentEnclosingContextRewriter.VisitBlock(BoundBlock node)
   at Microsoft.CodeAnalysis.CSharp.ExtensionMethodBodyRewriter.VisitBlock(BoundBlock node)
   at Microsoft.CodeAnalysis.CSharp.BoundBlock.Accept(BoundTreeVisitor visitor)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeVisitor.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.BoundTreeRewriterWithStackGuard.Visit(BoundNode node)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.LowerBodyOrInitializer(MethodSymbol method, SourceExtensionImplementationMethodSymbol extensionImplementationMethod, Int32 methodOrdinal, BoundStatement body, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState, MethodInstrumentation instrumentation, DebugDocumentProvider debugDocumentProvider, ImmutableArray`1& codeCoverageSpans, BindingDiagnosticBag diagnostics, VariableSlotAllocator& lazyVariableSlotAllocator, ArrayBuilder`1 lambdaDebugInfoBuilder, ArrayBuilder`1 lambdaRuntimeRudeEditsBuilder, ArrayBuilder`1 closureDebugInfoBuilder, ArrayBuilder`1 stateMachineStateDebugInfoBuilder, StateMachineTypeSymbol& stateMachineTypeOpt)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethod(MethodSymbol methodSymbol, Int32 methodOrdinal, ProcessedFieldInitializers& processedInitializers, SynthesizedSubmissionFields previousSubmissionFields, TypeCompilationState compilationState)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamedType(NamedTypeSymbol containingType)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.VisitNamedType(NamedTypeSymbol symbol, TypeCompilationState arg)
   at Microsoft.CodeAnalysis.CSharp.Symbols.NamedTypeSymbol.Accept[TypeCompilationState,Object](CSharpSymbolVisitor`2 visitor, TypeCompilationState argument)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileNamespace(NamespaceSymbol symbol)
   at Microsoft.CodeAnalysis.CSharp.MethodCompiler.CompileMethodBodies(CSharpCompilation compilation, PEModuleBuilder moduleBeingBuiltOpt, Boolean emittingPdb, Boolean hasDeclarationErrors, Boolean emitMethodBodies, BindingDiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.CSharp.CSharpCompilation.CompileMethods(CommonPEModuleBuilder moduleBuilder, Boolean emittingPdb, DiagnosticBag diagnostics, Predicate`1 filterOpt, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream metadataPEStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, RebuildData rebuildData, CompilationTestData testData, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, RebuildData rebuildData, CancellationToken cancellationToken)
   at Microsoft.CodeAnalysis.Compilation.Emit(Stream peStream, Stream pdbStream, Stream xmlDocumentationStream, Stream win32Resources, IEnumerable`1 manifestResources, EmitOptions options, IMethodSymbol debugEntryPoint, Stream sourceLinkStream, IEnumerable`1 embeddedTexts, Stream metadataPEStream, CancellationToken cancellationToken)
   at DotNetLab.Compiler.<>c__DisplayClass16_0.<CompileNoCacheAsync>g__getEmitStream|15(CSharpCompilation compilation, ImmutableArray`1& diagnostics)
   at DotNetLab.Compiler.<>c__DisplayClass16_0.<CompileNoCacheAsync>g__getPeFile|17(CSharpCompilation compilation, ImmutableArray`1& diagnostics)
   at DotNetLab.Compiler.CompileNoCacheAsync(CompilationInput compilationInput, ImmutableDictionary`2 assemblies, ImmutableDictionary`2 builtInAssemblies, AssemblyLoadContext alc)
   at DotNetLab.Compiler.CompileAsync(CompilationInput input, ImmutableDictionary`2 assemblies, ImmutableDictionary`2 builtInAssemblies, AssemblyLoadContext alc)
   at DotNetLab.Lab.CompilerProxy.CompileAsync(CompilationInput input)

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions