Maybe this question has been answered before, but the word if
occurs so often it's hard to find it.
The example doesn't make sense (the expression is always true), but it illustrates my question.
Why is this code valid:
StringBuilder sb;
if ((sb = new StringBuilder("test")) != null) {
Console.WriteLine(sb);
}
But this code isn't:
if ((StringBuilder sb = new StringBuilder("test")) != null) {
Console.WriteLine(sb);
}
I found a similar question regarding a while
statement. The accepted answer there says that in a while
statement, it would mean the variable would be defined in each loop. But for my if
statement example, that isn't the case.
So what's the reason we are not allowed to do this?
This is because section 8.5.1 of the C# language spec. states:
This basically means that, when you do:
You're, in effect, doing the exact same thing as:
As such, there is no longer a return value for your check against
!= null
, as the assignment isn't a single expression, but rather a statement, which is a local-variable-declarator comprised of an identifier followed by an expression.The language specification gives this example, stating that this:
Is exactly equivalent to:
As in Jeff's comment, the output is null for this code:
StringBuilder sb = new StringBuilder("test");
and the if statement requires a value.
Try C#7's Pattern Matching.
Using your example:
This has to do with the difference between a statement, and an expression. An expression has a value, whereas a statement does not.
Using your examples, notice these classifications:
Notice that only the middle portion is a expression.
Now we move onto your conditional statement. The syntax for using the not-equals operator is
So on both sides of the
!=
you need something that actually has a value (this just makes sense). Ergo, you cannot have statements on either side of the operator. This is why the one version of your code works, while the other does not.Instead of:
One could also write:
This for loop will execute once if your variable it not null. At the end of the loop, your temporary variable is set to null. The loop condition then evaluates to false, and the next statement continues after the closing brace is executed. Exactly as your if statement originally intended.