Lambda asignando variables locales.

Considere la siguiente fuente:

static void Main(string[] args)
{
    bool test;

    Action lambda = () => { test = true; };
    lambda();

    if (test)
        Console.WriteLine("Ok.");
}

Debería compilar, ¿verdad? Bueno, no es así. Mi pregunta es: de acuerdo con el estándar C #, ¿debería este código compilar o es un error del compilador?

El mensaje de error:

Use of unassigned local variable 'test'

Nota: I saber, como arreglar el error y yoparcialmente saber, Por que sucede. Sin embargo, la variable local se asigna incondicionalmente y supongo que ese compiladordebería Note eso, pero no lo hace. Me pregunto porque.

Comentario para respuestas: C #permite declarar variables no asignadas y eso es bastante útil, es decir.

bool cond1, cond2;
if (someConditions)
{
    cond1 = someOtherConditions1;
    cond2 = someOtherConditions2;
}
else
{
    cond1 = someOtherConditions3;
    cond2 = someOtherConditions4;
}

El compilador compila este código correctamente y creo que dejar las variables sin asignar hace que el código sea un poco mejor porque:

Le dice al lector que los valores se asignan más adelante (en su mayoría probablemente en la siguiente declaración condicional)Obliga al programador a asignar las variables en todas las ramas de las condiciones internas (si fue el propósito de este código desde el principio), porque el compilador se negará a compilar el código si una de las ramas no asigna una de ellas.

En el margen: Eso es aún más interesante. Considere el mismo ejemplo en 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;
}

Si comentas el bloqueo, la compilación termina con una advertencia:

main.cpp(12): warning C4700: uninitialized local variable 'test' used

Sin embargo, si elimina el comentario, el compilador no emite ningún tipo de advertencia. Me parece que es capaz de determinar si la variable se establece después de todo.

Respuestas a la pregunta(4)

Su respuesta a la pregunta