Discards are variables which you can assign to, but cannot read from. They don't have names. Instead, they are represented by an '_' (underscore). In C#7.0, they can appear in the following contexts:
- out variable declarations, such as
bool found = TryGetValue(out var _)
orbool found = TryGetValue(out _)
- deconstruction assignments, such as
(x, _) = deconstructable;
- deconstruction declarations, such as
(var x, var _) = deconstructable;
- is patterns, such as
x is int _
- switch/case patterns, such as
case int _:
The principal representation of discards is an _
(underscore) designation in a declaration expression. For example, int _
in an out variable declaration or var (_, _, x)
in a deconstruction declaration.
The second representation of discards is using the expression _
as a short-hand for var _
, when no variable named _
is in scope. It is allowed in out vars, deconstruction assignments and declarations, and plain assignments (_ = IgnoredReturn();
). It is, however, not allowed in C#7.0 patterns.
When a variable named _
does exist in scope, then the expression _
is simply a reference to that variable, as it did in earlier versions of C#.
###Grammar changes
declaration_expression
: type variable_designation
;
variable_designation
: single_variable_designation
| parenthesized_variable_designation
| discard_designation // new
;
discard_designation // new
: '_'
;
References C# Language Design Notes for Oct 25 and 26, 2016 C# Design Notes for Oct 18, 2016 Design proposal for discards Note that those notes used to refer to discards as "wildcards".