Вопрос по оператору if
Подскажите почему Foo1 компилируется а Foo2 нет?
static void Foo1()
{
int? a = 1;
if (a is int b)
b *= 2;
else
b = 3;
b *= 10;
}
static void Foo2()
{
int? a = 1;
if (false) { }
else
if (a is int b)
b *= 2;
else
b = 3;
b *= 10; // <- Error CS0103: The name 'b' does not exist in the current context.
}
Если написать код нормально, а не "случайно" пропустить все скобки, тогда можно и понять что и как работает. Вот аналогичный пример
public void Method()
{
if (true)
{
int a = 10;
if (a is int b)
{
b = 10; // Ok
}
b = 20; // Ok
}
b = 30; // Error
}
Можно сказать, что, когда мы используем конструкцию if (a is int b), переменная b остаётся в области видимости на уровне оператора if. В вашем первом случае, так и происходит:
static void Foo1()
{
int? a = 1;
if (a is int b)
{
b *= 2; // Ok
}
else
{
b = 3; // Ok
}
b *= 10; // Ok
}
Но во втором случае вы не можете вынести переменную b за область видимости верхнего if. Если написать код нормально, всё сразу станет на свои места:
static void Foo2()
{
int? a = 1;
if (false)
{
}
else
{
if (a is int b)
{
b *= 2; // Ok
}
else
{
b = 3; // Ok
}
}
b *= 10; // <- Error CS0103: The name 'b' does not exist in the current context.
}