Вопрос по оператору is

Подскажите почему 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.
}

Ответы (2 шт):

Автор решения: CrazyElf
   if (false) 
   { 
   }
   else
       if (a is int b)
          b *= 2;
       else
          b = 3;
       // здесь переменная b ещё существует

   // а здесь уже нет

   b *= 10; // <- Error CS0103: The name 'b' does not exist in the current context.
→ Ссылка
Автор решения: Faraday

Если написать код нормально, а не "случайно" пропустить все скобки, тогда можно и понять что и как работает. Вот аналогичный пример

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.
}
→ Ссылка