Лямбда присваивает локальные переменные

Рассмотрим следующий источник:

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

Однако, если вы удалите комментарий, компилятор не выдаст никаких предупреждений. Мне кажется, что он способен определить, установлена ли переменная в конце концов.

Ответы на вопрос(4)

Ваш ответ на вопрос