James Michael de Hare da la jure explicación: la variable local es definitivamente asignado, debido a que el código es inalcanzable y todas las variables locales se asignaron claramente en el código inalcanzable. Dicho de otra manera: el programa es solo un error si hay una forma de observar el estado de la variable local no inicializada. En su programa no hay forma de observar el local, y por lo tanto no es un error.
Ahora, observo que el compilador no tiene que ser infinitamente inteligente. Por ejemplo:
void M()
{
int x = 0;
int y;
if (x + 0 == x) return;
Console.WriteLine(y);
}
Usted y yo sabemos que la última línea del método es inalcanzable, pero el compilador no sabe que debido a que el analizador de accesibilidad no sabe que el cero es la identidad aditiva de números enteros. El compilador cree que la última línea podría ser accesible, y por lo tanto da un error.
Para obtener más información sobre los aspectos de diseño de analizadores de accesibilidad y de asignación definida en lenguajes de programación, ver mis artículos sobre el tema:
http://blogs.msdn.com/b/ericlippert/archive/tags/reachability/
http://blogs.msdn.com/b/ericlippert/archive/tags/definite+assignment/
que observar sin embargo que nadie ha respondido a la pregunta más profunda, que es ¿por qué si el error se suprime en el código inalcanzable? Como nota, damos otros errores de análisis semántico en el código inalcanzable.
Para considerar los pros y los contras de esa decisión, primero debe pensar por qué alguien tendría un código inalcanzable. O es intencionalmente inalcanzable o involuntariamente inalcanzable.
Si es involuntariamente inalcanzable, el programa contiene un error. La advertencia ya llama la atención sobre el problema principal: el código es inalcanzable. Hay algo muy mal con el flujo de control del método si hay un código inalcanzable. Las probabilidades son buenas de que el desarrollador tenga que realizar un cambio serio en el flujo de control del método; cualquier análisis de variables locales que hagamos en el código inalcanzable probablemente sea un ruido engañoso. Deje que el desarrollador corrija el código para que todo sea accesible, y luego, haremos un análisis del código ahora accesible para los errores relacionados con el flujo de control.
Si el código inalcanzable es inalcanzable porque el desarrollador pretende que sea inalcanzable, entonces las probabilidades son buenas que están haciendo algo como esto:
// If we can Blah, then Frob. However, if we cannot Blah and we can Baz, then Foo.
void M()
{
int y;
// TODO: The Blah method has a bug and always throws right now; fix it later.
if (false /* Blah(out y) */)
{
Frob(y);
}
else if (Baz(out y))
{
Foo(y);
}
}
caso Frob(y)
ser un error en este programa?
Solo me pregunto: ¿Alguna vez quiere que 'TRUE' evalúe a todo menos' verdad'? –
Una variable no utilizada no evitaría que tu código funcione o compila, por lo que es solo un mensaje de advertencia. Intentar utilizar un método no definido evitaría que tu código se ejecute, por lo que es un error. No estoy seguro de entender el problema. – AaronS
@BrianRasmussen ¿Tal vez viene de un lenguaje donde la palabra clave "verdadera" está en mayúsculas? – Servy