Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
188 commits
Select commit Hold shift + click to select a range
81db7dd
fix: preserve numeric conversion signedness and overflow checks
jogibear9988 Oct 18, 2026
83c49a6
fix: emit nullable Boolean operators with three-valued logic
jogibear9988 Oct 18, 2026
7089afa
fix: reject extension reductions that make no progress
jogibear9988 Oct 18, 2026
f151c1d
fix: box value operands before emitting type tests
jogibear9988 Oct 18, 2026
da8381f
test: run compatibility regressions on .NET Framework
jogibear9988 Oct 18, 2026
744a847
fix: box constants declared as reference base types and interfaces
jogibear9988 Oct 18, 2026
d89e0b6
fix: unbox values converted from ValueType and nullable interfaces
jogibear9988 Oct 18, 2026
f0bcd1b
fix: load nullable arithmetic locals as values
jogibear9988 Oct 18, 2026
3ea1b73
fix: preserve null when boxing nullable values to reference types
jogibear9988 Oct 18, 2026
486f6f7
fix: normalize nullable and wide array bounds before allocation
jogibear9988 Oct 18, 2026
980d469
test: retain lifted arithmetic operator regressions
jogibear9988 Oct 27, 2026
9845e1e
fix: emit unsigned division for unsigned arithmetic results
jogibear9988 Oct 18, 2026
b1aaf55
test: retain Not and OnesComplement regression coverage
jogibear9988 Oct 18, 2026
d59a877
fix: dereference by-ref operands when emitting conversions
jogibear9988 Oct 18, 2026
a885742
fix: emit typed and lifted increment and decrement operations
jogibear9988 Oct 18, 2026
77f8109
fix: honor explicit methods for increment and decrement assignments
jogibear9988 Oct 18, 2026
a23fcaa
fix: emit valid instance calls and index access on struct receivers
jogibear9988 Oct 18, 2026
af1573d
fix: preserve nullable and unsigned numeric comparison semantics
jogibear9988 Oct 18, 2026
d5cbbae
fix: convert both nullable coalesce branches to the result type
jogibear9988 Oct 18, 2026
4f4d55d
fix: discard values and preserve control flow for void label targets
jogibear9988 Oct 18, 2026
7c7e0ed
test: use a portable explicit conversion oracle for coalesce
jogibear9988 Oct 18, 2026
180e3aa
test: retain unary increment and decrement value regressions
jogibear9988 Oct 27, 2026
f7caf44
fix: route typed jumps through their actual label targets
jogibear9988 Oct 18, 2026
b403d21
fix: preserve reference identity in equality expressions
jogibear9988 Oct 18, 2026
7285900
fix: emit user-defined conditional logical operators
jogibear9988 Oct 18, 2026
f0fc953
fix: invoke coalesce conversion callbacks on non-null operands
jogibear9988 Oct 18, 2026
6a55266
fix: honor custom Not methods in conditionals and interpretation
jogibear9988 Oct 18, 2026
3a4daf9
test: retain lifted Not and OnesComplement method regressions
jogibear9988 Oct 18, 2026
0571f07
fix: preserve original boxed constant identity in reference contexts
jogibear9988 Oct 18, 2026
589b337
fix: honor explicit binary methods in arithmetic and compound assignment
jogibear9988 Oct 18, 2026
715d6a9
test: retain exact runtime type comparison regressions
jogibear9988 Oct 27, 2026
fe4f299
fix: apply compound assignment conversions before nullable writeback
jogibear9988 Oct 18, 2026
92fc3d1
test: skip compiler-layout assertions only after strict behavior vali…
jogibear9988 Oct 18, 2026
853b874
fix: spill compound assignment targets around complex right operands
jogibear9988 Oct 18, 2026
112f5de
test: retain checked and nullable negation regressions
jogibear9988 Oct 27, 2026
57eeb3b
fix: evaluate nullable arithmetic right operands before null propagation
jogibear9988 Oct 18, 2026
f1b6c0a
fix: preserve pending arithmetic values around nested exception blocks
jogibear9988 Oct 18, 2026
95f31f0
test: retain custom truth and nullable IsFalse regressions
jogibear9988 Oct 27, 2026
aaf6a35
fix: preserve checked integer and floating-point arithmetic semantics
jogibear9988 Oct 18, 2026
000fbad
fix: constrain integer switch tables to valid unique 32-bit indices
jogibear9988 Oct 18, 2026
a006d40
fix: preserve comparison methods and identity through conditional red…
jogibear9988 Oct 18, 2026
874c98a
fix: lift shifts with nullable counts and nonnullable left operands
jogibear9988 Oct 18, 2026
4f46321
fix: resolve nonpublic delegate Invoke methods
jogibear9988 Oct 18, 2026
9395b15
fix: check null reference receivers for nonvirtual instance calls
jogibear9988 Oct 18, 2026
bf014ee
fix: copy readonly value fields before calling mutating members
jogibear9988 Oct 18, 2026
3870928
fix: address multidimensional array elements for value member access
jogibear9988 Oct 18, 2026
5ff3a6f
test: retain custom unary-plus regression coverage
jogibear9988 Oct 27, 2026
5a84169
fix: pass addresses to explicit ref-parameter conversion methods
jogibear9988 Oct 18, 2026
ae2de89
fix: make invocation results addressable for ref arguments
jogibear9988 Oct 18, 2026
fb14334
fix: preserve direct value-type calls through ref receivers
jogibear9988 Oct 18, 2026
8d346d5
fix: preserve decimal constant sign and scale
jogibear9988 Oct 18, 2026
319b1a5
fix: lift user-defined conditional logical operators
jogibear9988 Oct 18, 2026
ae39f93
feat: emit guarded exception filters in the existing try emitter
jogibear9988 Oct 18, 2026
d3be3c4
fix: spill delegate targets and arguments around exception regions
jogibear9988 Oct 18, 2026
ec0cb3e
fix: spill index receivers and arguments around exception regions
jogibear9988 Oct 18, 2026
90f08c3
fix: discard unused list initializer Add results
jogibear9988 Oct 18, 2026
9643adf
fix: preserve strict filter rejection on .NET Framework
jogibear9988 Oct 18, 2026
b9eb1f8
test: make regression oracles portable to .NET Framework
jogibear9988 Oct 18, 2026
f5b90c8
fix: load writable boxed capture addresses for ref arguments
jogibear9988 Oct 18, 2026
c73a20e
fix: initialize static members without instance operands
jogibear9988 Oct 18, 2026
653ba8d
fix: spill array bounds and initializer values around exception regions
jogibear9988 Oct 18, 2026
c5795d3
fix: spill list initializer operands around exception regions
jogibear9988 Oct 18, 2026
aad5f33
fix: spill member initializer receivers and binding values around exc…
jogibear9988 Oct 18, 2026
1735aa6
fix: share constructor argument spilling for intrinsic expression nodes
jogibear9988 Oct 18, 2026
b4834a1
test: exclude proven system compiler layout assertions with reasons
jogibear9988 Oct 18, 2026
4645b79
fix: emit actual array accessors for rank-one non-vector arrays
jogibear9988 Oct 18, 2026
fcf1b29
feat: emit capture-free quotes and empty runtime-variable views
jogibear9988 Oct 18, 2026
9c3aa1a
fix: compile direct quoted lambda invocations through existing emitters
jogibear9988 Oct 18, 2026
da250aa
feat: emit nested member and list initializer bindings
jogibear9988 Oct 18, 2026
c9f6821
fix: preserve typed ref arguments and property copyback across calls
jogibear9988 Oct 18, 2026
c229e9e
fix: preserve readonly copies and typed static field addresses
jogibear9988 Oct 18, 2026
d9cf2e0
fix: preserve non-runtime Type constant identities
jogibear9988 Oct 18, 2026
54e7e18
fix: reduce custom expression node types through the standard contract
jogibear9988 Oct 18, 2026
f8b31ba
test: cover quoted lambda indexer arguments
jogibear9988 Oct 18, 2026
8c47b7b
fix: preserve runtime switch test evaluation and void results
jogibear9988 Oct 18, 2026
34a5c81
test: temporarily defer the known deep-expression stack crash
jogibear9988 Oct 18, 2026
9ef43ee
test: exclude the now-verified inline-ref IL layout oracle
jogibear9988 Oct 18, 2026
67206ff
fix: reject abstract constructor calls before returning a delegate
jogibear9988 Oct 18, 2026
fd308f2
fix: preserve quotation identity across nested Light compilation
jogibear9988 Oct 18, 2026
ba84af7
test: retain Framework FEC behavior checks when its system oracle is …
jogibear9988 Oct 18, 2026
4c00968
test: verify Framework ref-call semantics without invalid system oracles
jogibear9988 Oct 18, 2026
2b3a72e
test: verify nested initializer behavior before excluding system IL o…
jogibear9988 Oct 18, 2026
a3ac07a
fix: preserve writable Unbox and runtime array receiver storage
jogibear9988 Oct 18, 2026
f70cd92
fix: prepare ref arguments using their formal storage types
jogibear9988 Oct 18, 2026
cfa0433
fix: reject lambda signatures that exceed the method parameter limit
jogibear9988 Oct 18, 2026
36c2faa
Report duplicate label definitions with InvalidOperationException
jogibear9988 Oct 18, 2026
e4efb2e
test: separate verified FEC behavior from System representation asser…
jogibear9988 Oct 18, 2026
f948f69
fix: preserve the full character width through managed references
jogibear9988 Oct 18, 2026
751295e
Preserve value payloads on Light continue gotos
jogibear9988 Oct 18, 2026
fef592c
fix: validate abstract constructors in nested Light lambdas
jogibear9988 Oct 18, 2026
ff76281
test: verify behavior before excluding interpreter representation ass…
jogibear9988 Oct 18, 2026
3537c68
Validate rethrow and catch filter scopes during collection
jogibear9988 Oct 18, 2026
dc144a0
Validate jumps across exception region boundaries
jogibear9988 Oct 18, 2026
e295b2b
Support invoking runtime expression-tree values
jogibear9988 Oct 18, 2026
6ac54a1
Load invocation receivers by value before calling them
jogibear9988 Oct 18, 2026
eb0cb87
test: register remaining compatibility regressions in both runners
jogibear9988 Oct 18, 2026
d618de8
fix: spill invocation operands across argument jumps
jogibear9988 Oct 18, 2026
1c69903
Bind reused label targets within sibling block scopes
jogibear9988 Oct 18, 2026
3252b3b
Reject label redefinition inside an active default expression
jogibear9988 Oct 18, 2026
2ad846a
test: register scoped labels and exercise both invocation modes
jogibear9988 Oct 18, 2026
76d8528
Compile dynamic expressions through per-occurrence DLR call sites
jogibear9988 Oct 18, 2026
98906d6
Keep rethrow validation inside inlined lambda boundaries
jogibear9988 Oct 18, 2026
eb74a21
Propagate argument jumps through enclosing calls and constructors
jogibear9988 Oct 18, 2026
5d9a47a
Defer runtime expression compilation for structural argument spills
jogibear9988 Oct 18, 2026
68d1193
Keep argument-local returns inside inlined invocation wrappers
jogibear9988 Oct 18, 2026
fa6664f
Keep stateful dynamic sites distinct across nested lambda occurrences
jogibear9988 Oct 18, 2026
3f1c8fb
Preserve argument-local returns in computed delegate invocations
jogibear9988 Oct 18, 2026
7ec9b78
test: register final dynamic and invocation compatibility regressions
jogibear9988 Oct 18, 2026
f3ccc04
fix: propagate the trimming contract to argument spill metadata
jogibear9988 Oct 18, 2026
8e83027
Preserve physical method tail returns across scoped label definitions
jogibear9988 Oct 18, 2026
9a18b80
test: run method-tail return regressions in every native runner
jogibear9988 Oct 18, 2026
d5f18f6
test: keep by-ref spill behavior checks on Framework
jogibear9988 Oct 18, 2026
31de3fe
Make exception validation test oracles portable to Framework
jogibear9988 Oct 18, 2026
b30f2ce
fix: restore the declaring variable scope when leaving nested blocks
jogibear9988 Oct 18, 2026
1b581e5
fix: duplicate only the final assignment field address
jogibear9988 Oct 18, 2026
d1de091
feat: bind captured quotes and runtime variables to shared typed cells
jogibear9988 Oct 18, 2026
25e938a
test: verify shared struct-cell IL after executing its behavior
jogibear9988 Oct 18, 2026
942b965
test: retain Framework filter rejection while checking catch quote cells
jogibear9988 Oct 18, 2026
c7ea90e
fix: keep struct operator operands separate from receiver addresses
jogibear9988 Oct 18, 2026
40615f9
test: account for Framework System quote block typing
jogibear9988 Oct 18, 2026
2e56eff
fix: validate lexical scope of label jumps
jogibear9988 Oct 18, 2026
176c196
Verify runtime-variable spill behavior before excluding IL snapshots
jogibear9988 Oct 18, 2026
9ea59b4
Keep unary and conversion operands in value contexts
jogibear9988 Oct 18, 2026
7ce9bc4
Test FEC rejection contracts for irreducible expression nodes
jogibear9988 Oct 18, 2026
0598d01
Classify interpreter-specific runtime assertions with compiled behavi…
jogibear9988 Oct 18, 2026
e528fe3
Fix non-Exception catch policy for generated methods
jogibear9988 Oct 18, 2026
5fecc92
Preserve original string constant reference identity
jogibear9988 Oct 18, 2026
2f9c08e
Keep Framework boxed receivers verifiable during argument spills
jogibear9988 Oct 18, 2026
aa0bbbf
Reuse collected delegate invocation parameters
jogibear9988 Oct 19, 2026
b5f2390
Avoid eager scope and exception metadata allocations on label-free paths
jogibear9988 Oct 19, 2026
063888b
Reuse collected reductions for dynamic and quoted extension nodes
jogibear9988 Oct 19, 2026
3cd2d09
Reuse hoisted capture reflection metadata within each compilation
jogibear9988 Oct 19, 2026
5fbf65a
Keep lazy JIT with anonymous catch policy on modern runtimes
jogibear9988 Oct 19, 2026
24641cd
Keep provably readonly captures in existing value closure slots
jogibear9988 Oct 19, 2026
f4649c0
Fold immutable constant string lengths without capturing string storage
jogibear9988 Oct 19, 2026
974d5f8
Reuse transient scope buffers and skip terminal-node scope tracking
jogibear9988 Oct 19, 2026
0241547
Analyze capture storage mutations once per compilation root
jogibear9988 Oct 19, 2026
fd2d1b3
Reuse capture call signatures and avoid cells for value arguments
jogibear9988 Oct 19, 2026
4511534
Collect switch test values without enumerator allocations
jogibear9988 Oct 19, 2026
e01547e
Allocate hoisted type cache only for actual shared cells
jogibear9988 Oct 19, 2026
75909e5
Identify vector arrays directly on modern runtimes
jogibear9988 Oct 19, 2026
fefb2aa
Keep lexical and exception ancestry in inline indexed metadata
jogibear9988 Oct 19, 2026
8f2b825
Collect terminal expression nodes before tracking lexical scopes
jogibear9988 Oct 19, 2026
b67c386
Keep quote and dynamic emission maps off ordinary compiler contexts
jogibear9988 Oct 19, 2026
d510513
Allocate invocation spill metadata only for arguments with jumps
jogibear9988 Oct 19, 2026
1bb9d10
Preserve readonly capture layout through control flow and initializers
jogibear9988 Oct 19, 2026
94cdf88
Keep primitive arithmetic emission outside lifted-operation handling
jogibear9988 Oct 19, 2026
64d9001
Track capture slot writes precisely and scan simple initializers once
jogibear9988 Oct 19, 2026
91fb3a5
Reuse cleared capture metadata rentals and resolve constructor handles
jogibear9988 Oct 19, 2026
57f97c6
Cover captures alongside static indexed property access
jogibear9988 Oct 19, 2026
96aa3d0
Skip scoped label helpers while emitting label-free blocks
jogibear9988 Oct 19, 2026
038627b
Share root capture analysis before propagating nested parameters
jogibear9988 Oct 19, 2026
1ba5236
Remove exception cleanup regions from internal collector recursion
jogibear9988 Oct 19, 2026
5f49fe2
Keep common scope compression and unchanged-depth returns inline
jogibear9988 Oct 19, 2026
76c2d89
Avoid primitive arithmetic spills for atomic operands after EH
jogibear9988 Oct 19, 2026
fbda9d5
Inline the empty capture-parameter cache path
jogibear9988 Oct 19, 2026
9ec5f12
Reuse operand types in scalar arithmetic emission
jogibear9988 Oct 19, 2026
582a738
Keep private mutable reference captures in their sole child value slot
jogibear9988 Oct 19, 2026
cf10ae4
Use native boxed storage for live nonnullable value captures
jogibear9988 Oct 19, 2026
54dd400
Recognize only known intrinsic storage shapes before capture emission
jogibear9988 Oct 19, 2026
db6c683
Cover live boxed struct receivers with exception-block call arguments
jogibear9988 Oct 19, 2026
0ae0fcd
Keep Framework mutable captures in verifiable typed cells
jogibear9988 Oct 19, 2026
8c5bee1
Exercise hoisted metadata overflow clearing with native boxed captures
jogibear9988 Oct 19, 2026
f549d99
Batch collection of consecutive single-expression block scopes
jogibear9988 Oct 19, 2026
244fc7b
Reuse the initial node type during collection
jogibear9988 Oct 19, 2026
c7e7684
Avoid root capture scans when typed storage is already required
jogibear9988 Oct 19, 2026
61a1d00
Reuse private reference slots through constructor and array containers
jogibear9988 Oct 19, 2026
29ca5d2
Establish the actual capture-analysis root before intrinsic collection
jogibear9988 Oct 19, 2026
bf4f467
Avoid materializing Light array operands during private capture analysis
jogibear9988 Oct 19, 2026
c5c6315
Restore typed reference loads for verified Framework closure slots
jogibear9988 Oct 19, 2026
88f9ce4
Defer quote and runtime-variable metadata on unrelated compilation paths
jogibear9988 Oct 19, 2026
12f175a
Declare trimming requirement for lazy quote metadata holder
jogibear9988 Oct 19, 2026
0ea1dc4
Keep scope overflow arrays in compact geometric pool buckets
jogibear9988 Oct 19, 2026
be320e4
Skip empty jump validators on jump-free expression trees
jogibear9988 Oct 19, 2026
02cce80
Reduce Framework capture constructor metadata allocations
jogibear9988 Oct 19, 2026
057c7cd
Type Framework capture parameters in existing rented signatures
jogibear9988 Oct 19, 2026
c6e1abf
Avoid the full collector for terminal binary roots
jogibear9988 Oct 19, 2026
abacfdd
Use boxed Framework value cells in proven owned roots
jogibear9988 Oct 19, 2026
61fee31
Avoid redundant Framework delegate casts in proven owned roots
jogibear9988 Oct 19, 2026
570d7b2
Restore owned Framework capture slot loads without extra casts
jogibear9988 Oct 19, 2026
11085ff
Avoid arithmetic operand spills when the right side cannot enter EH
jogibear9988 Oct 19, 2026
0a8ff91
Materialize try results before using struct receiver addresses
jogibear9988 Oct 19, 2026
7d314fe
test: cover upstream SmallMap promotion with colliding keys
jogibear9988 Oct 19, 2026
1d2beb0
Use the supported anonymous DynamicMethod constructor for exception-a…
jogibear9988 Oct 19, 2026
5a5fbd1
Explain scope pool buckets and outlined frame growth
jogibear9988 Oct 19, 2026
9ed3e1e
Cover opaque quotes and pruned invocation spill ordering
jogibear9988 Oct 19, 2026
3766e35
fix: recognize converted simple arithmetic operands without bypassing…
jogibear9988 Oct 24, 2026
02a794a
docs: consolidate compatibility and performance validation records
jogibear9988 Oct 25, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 23 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ Moreover the compiled delegate may be slower than the manually created delegate
_TL;DR;_
> Expression.Compile creates a DynamicMethod and associates it with an anonymous assembly to run it in a sand-boxed environment. This makes it safe for a dynamic method to be emitted and executed by partially trusted code but adds some run-time overhead.

FEC keeps owned DynamicMethods for ordinary lambdas. Methods containing exception regions use anonymous hosting to match System's non-Exception throw and catch policy. The APIs that skip collection also use anonymous hosting, because their exception regions are unknown before emission. Anonymous hosting adds eager JIT work when creating the delegate. `CompileFastToIL` inherits the host policy of the caller's method.

See also [a deep dive to Delegate internals](https://mattwarren.org/2017/01/25/How-do-.NET-delegates-work/#different-types-of-delegates).


Expand Down Expand Up @@ -263,17 +265,34 @@ var x = f(new B());
The idea is to provide the fast compilation for the supported expression types
and fallback to the system `Expression.Compile()` for the not supported types:

Invoking a runtime `System.Linq.Expressions.Expression<TDelegate>` value compiles that value
with its `Compile()` method before invoking the resulting delegate, as the system compiler does.
This runtime operation is distinct from compilation fallback: with
`CompileFast(ifFastFailedReturnNull: true)`, FEC still compiles the surrounding lambda directly.
Errors from compiling or executing the runtime expression propagate to its caller.
Ref-property arguments retain FEC's normal setter copyback after successful invocation.
The system compiler can lose this copyback when another argument contains an exception
block; FEC preserves the property mutation instead of reproducing that behavior.

Dynamic expressions use ordinary DLR call sites: each emitted occurrence has its own site,
reuses binding rules, and reads the current mutable `Target` for every invocation.
Runtime binder rule compilation is intrinsic DLR behavior; the outer lambda still compiles directly with FEC.

Quoted lambdas and `RuntimeVariables` share live typed cells with compiled outer and sibling lambdas.
Mutations remain visible after the creating method returns; independent activations keep separate storage.
Capture-free quoted trees retain their original identity. The closure arrays and direct IL emitter remain in use.

### What's not supported yet

**FEC does not support yet:**

- `Quote`
- `Dynamic`
- `RuntimeVariables`
- Captures of by-ref parameters, pointer types, or byref-like values that cannot be stored in a heap cell
- Reused physical method-tail labels reached with pending operand values or from protected exception regions (strict null / `NotSupported_MethodReturn_Context`)
- `DebugInfo`
- `MemberInit` with the `MemberMemberBinding` and the `ListMemberBinding` binding types
- `NewArrayInit` multi-dimensional array initializer is not supported yet

Nested `MemberInit` member and list bindings are supported. Very deep expression trees still have a known recursive traversal limit; see the [runtime compatibility results](test/FastExpressionCompiler.DotNetRuntimeTests/results/fixes/README.md).

To find what nodes are not supported in your expression you may use the technic described below in the [Diagnostics](#diagnostics) section.

The compilation is done by traversing the expression nodes and emitting the IL.
Expand Down
22 changes: 11 additions & 11 deletions src/FastExpressionCompiler.LightExpression/Expression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1340,21 +1340,22 @@ public static ElementInit ElementInit(MethodInfo addMethod, params Expression[]
public static ElementInit ElementInit(MethodInfo addMethod, IEnumerable<Expression> arguments) =>
ElementInit(addMethod, arguments.AsReadOnlyList());

[RequiresUnreferencedCode(Trimming.Message)]
// The outer tree still consists of LightExpression nodes. A parameter or constant
// may hold a System Expression<TDelegate> as runtime data; Invoke compiles that
// value and invokes its delegate. This does not mix System nodes into the tree.
private static Type GetInvocationReturnType(Expression expression) =>
expression is LambdaExpression directLambda ? directLambda.ReturnType :
expression is UnaryExpression quote && quote.NodeType == ExpressionType.Quote && quote.Operand is LambdaExpression lambda
? lambda.ReturnType
: (expression.Type.FindExpressionCompileMethod()?.ReturnType ?? expression.Type).FindDelegateInvokeMethod().ReturnType;

public static InvocationExpression Invoke(LambdaExpression expression) =>
new NotNullExpressionInvocationExpression(expression);

public static InvocationExpression Invoke(LambdaExpression expression, Expression a0) =>
new OneArgumentInvocationExpression(expression, a0);

[MethodImpl((MethodImplOptions)256)]
[RequiresUnreferencedCode(Trimming.Message)]
private static Type GetInvocationReturnType(Expression expression) =>
expression is LambdaExpression lambda
? lambda.ReturnType
: expression is UnaryExpression unExpr && unExpr.NodeType == ExpressionType.Quote && unExpr.Operand is LambdaExpression quotedLambda
? quotedLambda.ReturnType
: expression.Type.FindDelegateInvokeMethod().ReturnType;

[RequiresUnreferencedCode(Trimming.Message)]
public static InvocationExpression Invoke(Expression expression, Expression a0) =>
expression is LambdaExpression
Expand Down Expand Up @@ -6063,11 +6064,10 @@ internal TypedReturnManyParametersExpression(Expression body, IReadOnlyList<Para
: base(body, parameters) => ReturnType = returnType;
}

// todo: @feature is not supported yet
public sealed class DynamicExpression : Expression
{
public override ExpressionType NodeType => ExpressionType.Dynamic;
public override Type Type { get;}
public override Type Type { get; }
public Type DelegateType { get; }
public CallSiteBinder Binder { get; }
public IReadOnlyList<Expression> Arguments { get; }
Expand Down
Loading
Loading