Лямбда присваивает локальные переменные
Рассмотрим следующий источник:
static void Main(string[] args)
{
bool test;
Action lambda = () => { test = true; };
lambda();
if (test)
Console.WriteLine("Ok.");
}
Это должно скомпилировать, верно? Ну, это нет. Мой вопрос: согласно стандарту C # этот код должен компилироваться или это ошибка компилятора?
Сообщение об ошибке:Use of unassigned local variable 'test'
Примечание: язнатькак исправить ошибку и ячастично знаюпочему это происходит Тем не менее, локальная переменная назначается безоговорочно, и я думаю, что компилятордолжен обратите внимание, но это не так. Интересно, почему.
Комментарий к ответам: C #позволяет объявив неназначенные переменные ина самом деле довольно полезно, т.е.
bool cond1, cond2;
if (someConditions)
{
cond1 = someOtherConditions1;
cond2 = someOtherConditions2;
}
else
{
cond1 = someOtherConditions3;
cond2 = someOtherConditions4;
}
Компилятор компилирует этот код должным образом, и я думаю, что оставление переменных неназначенными на самом деле делает код немного лучше, потому что:
Это говорит читателю, что значения назначаются позже (в основном, вероятно, в следующем условном выражении)Заставляет программиста назначать переменные во всех ветвях внутренних условий (если это было целью этого кода с самого начала), потому что компилятор откажется компилировать код, если одна из ветвей не назначит одну из них.На полях: Тот'Еще интереснее. Рассмотрим тот же пример в C ++:
int main(int argc, char * argv[])
{
bool test;
/* Comment or un-comment this block
auto lambda = [&]() { test = true; };
lambda();
*/
if (test)
printf("Ok.");
return 0;
}
Если вы закомментируете блок, компиляция заканчивается предупреждением:
main.cpp(12): warning C4700: uninitialized local variable 'test' used
Однако, если вы удалите комментарий, компилятор не выдаст никаких предупреждений. Мне кажется, что он способен определить, установлена ли переменная в конце концов.