Вопрос по оператору 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.
}