Description
Expression blocks
Summary
- Specification: Link to a filled out proposal template. If not yet available, link to the PR adding the specification.
- Discussion: Proposal: Expression blocks #9242
Allow a block of statements with a trailing expression as an expression.
Syntax
expression
: non_assignment_expression
| assignment
;
non_assignment_expression
: conditional_expression
| lambda_expression
| query_expression
| block_expression
;
block_expression
: '{' statement+ expression '}'
;
Examples:
x = { ; 1 }; // expression block
x = { {} 2 }; // expression block
y = new MyCollection[]
{
{ F(), 3 }, // collection initializer
{ F(); 4 }, // expression block
};
f = () => { F(); G(); }; // block body
f = () => { F(); G() }; // expression body
Execution
An expression block is executed by transferring control to the first statement.
When and if control reaches the end of a statement, control is transferred to the next statement.
When and if control reaches the end of the last statement, the trailing expression is evaluated and the result left on the evaluation stack.
The evaluation stack may not be empty at the beginning of the expression block so control cannot enter the block other than at the first statement.
Control cannot leave the block other than after the trailing expression unless an exception is thrown executing the statements or the expression.
Restrictions
return
, yield break
, yield return
are not allowed in the expression block statements.
break
and continue
may be used only in nested loops or switch
statements.
goto
may be used to jump to other statements within the expression block but not to statements outside the block.
out
variable declarations in the statements or expression are scoped to the expression block.
using expr;
may be used in the statements. The implicit try
/ finally
surrounds the remaining statements and the trailing expression so Dispose()
is invoked after evaluating the trailing expression.
Expression trees cannot contain block expressions.
Design Meetings/Alternatives
Proposal: Sequence Expressions #377
LDM 2020-01-22
https://github.com/dotnet/csharplang/blob/main/meetings/2022/LDM-2022-09-26.md#discriminated-unions
https://github.com/dotnet/csharplang/blob/main/meetings/2024/LDM-2024-08-28.md#block-bodied-switch-expression-arms