csharplang/proposals/csharp-7.0/throw-expression.md

33 lines
1.5 KiB
Markdown
Raw Normal View History

2019-03-06 01:14:18 +01:00
# Throw expression
We extend the set of expression forms to include
```antlr
throw_expression
: 'throw' null_coalescing_expression
;
null_coalescing_expression
: throw_expression
;
```
The type rules are as follows:
- A *throw_expression* has no type.
- A *throw_expression* is convertible to every type by an implicit conversion.
A *throw expression* throws the value produced by evaluating the *null_coalescing_expression*, which must denote a value of the class type `System.Exception`, of a class type that derives from `System.Exception` or of a type parameter type that has `System.Exception` (or a subclass thereof) as its effective base class. If evaluation of the expression produces `null`, a `System.NullReferenceException` is thrown instead.
The behavior at runtime of the evaluation of a *throw expression* is the same [as specified for a *throw statement*](../../spec/statements.md#the-throw-statement).
The flow-analysis rules are as follows:
- For every variable *v*, *v* is definitely assigned before the *null_coalescing_expression* of a *throw_expression* iff it is definitely assigned before the *throw_expression*.
- For every variable *v*, *v* is definitely assigned after *throw_expression*.
A *throw expression* is permitted in only the following syntactic contexts:
- As the second or third operand of a ternary conditional operator `?:`
- As the second operand of a null coalescing operator `??`
- As the body of an expression-bodied lambda or method.