Уточнение вопроса: Я не ищу ответы на вопрос о том, как решить эту проблему (некоторые из них перечислены ниже), но почему это происходит.
Я ожидаю, что следующий код будет скомпилирован:
struct Alice
{
public string Alpha;
public string Beta;
}
struct Bob
{
public long Gamma;
}
static object Foo(dynamic alice)
{
decimal alpha;
long beta;
if (!decimal.TryParse(alice.Alpha, out alpha) // *
|| !long.TryParse(alice.Beta, out beta)) // **
{
return alice;
}
var bob = new Bob { Gamma = beta }; // ***
// do some stuff with alice and bob
return alice;
}
Однако следующая ошибка времени компиляции генерируется при // ***:
Использование неназначенной локальной переменной 'beta'
Я могу скомпилировать программу в следующих ситуациях:
-
Если я изменяю подпись
static object Foo(Alice alice) -
Явное литье на строках
// *и// **, например:!long.TryParse((string)alice.Beta, out beta). -
Удаление
decimal.TryParseв строке// *. -
Замена короткого замыкания или
||на|. Благодаря HansPassant -
Перемещение
TryParseвокруг -
Вытягивание результатов
TryParseвboolБлагодаря Chris -
Назначение значения по умолчанию
beta
Я пропустил что-то очевидное, или есть что-то тонкое, или это ошибка?