Уточнение вопроса: Я не ищу ответы на вопрос о том, как решить эту проблему (некоторые из них перечислены ниже), но почему это происходит.
Я ожидаю, что следующий код будет скомпилирован:
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
Я пропустил что-то очевидное, или есть что-то тонкое, или это ошибка?