2012-03-15 10 views
7

A continuación aparece un error de tiempo de compilación que dice "Uso de la variable local no asignada 'coincidir'" si solo ingreso cadena coincidente; pero funciona cuando uso string match = null; Entonces, ¿cuál es la diferencia y, en general, si a una cadena no se le está asignando un valor de inmediato, debería asignar a nulo de esta manera?¿Qué hace la asignación de variables a null?

string question = "Why do I need to assign to null"; 
char[] delim = { ' ' }; 
string[] strArr = question.Split(delim); 
//Throws Error 
string match; 
//No Error 
//string match = null; 
foreach (string s in strArr) 
{ 
    if (s == "Why") 
     { 
     match = "Why"; 
     } 
} 
Console.WriteLine(match); 
+0

El compilador solo quiere saber que lo decía en serio :-) – Jodrell

+0

Todavía existen varias respuestas en StackOverflow: solo una -> http://stackoverflow.com/questions/256073/c-sharp-error-use-of-unassigned -local-variable – AngeloBad

Respuesta

12

El lenguaje C# impide el uso de un local hasta que se le haya asignado definitivamente un valor. En este ejemplo, el compilador no comprende la semántica de Split y debe suponer que strArr puede ser una colección vacía y, por lo tanto, el cuerpo del bucle podría no ejecutarse. Esto significa que desde una perspectiva de asignación definitiva, el foreach no asigna un valor a match. Por lo tanto, sigue sin asignar cuando llega a WriteLine

Al cambiar la declaración a string match = null, el valor se marca como definitivamente asignado desde el principio. Por lo tanto, el cálculo de bucle no importa

4

Has encontrado la diferencia entre la declaración y la asignación. Declaración, con líneas como

string match; 

simplemente declara al compilador que va a utilizar una variable de tipo cadena match. Asignación, con líneas como

match = null; 

asigna el valor null a match.

Es posible que un idioma declare que la declaración y la asignación siempre deben separarse (no estoy 100% seguro, pero creo que las versiones anteriores de Visual Basic lo hicieron), pero la mayoría de los idiomas le permiten combinar declaración y asignación, escribiendo

string match = null; // combined declaration and assignment 

que significa

string match; // declaration 
match = null; // assignment 

C# requiere que se asignan las variables antes de ser utilizados. A diferencia de los campos y eventos, a las variables locales no se les asignan automáticamente los valores predeterminados, por lo que debe probar al compilador que, antes de usar match, match tendrá algún valor. Al compilador no le importa qué valor tiene match, siempre que esa variable sea de tipo cadena.

En su caso, el compilador no puede probar con el análisis local que habrá strArr no vacío porque el compilador no inspecciona el código de Split, así que no hay garantía de que el código será incluso entrar en el bucle foreach, deja a lo largo de cumplir la condición para asignar a match. Como la llamada Console.WriteLine usa match, y como match no se puede asignar en tiempo de ejecución con la declaración string match, el compilador requiere que asigne match fuera del ciclo. Una forma de cumplir el requisito es usar string match = null en lugar de string match.

0

Cuando declara, type variable = null;, está inicializando la variable. Si declara type variable;, solo está declarando la variable.

+0

debe ser 'variable = null' - double == es el comparador igual – Haedrian

+0

lo arregló! estaba demasiado ansioso ... –

2

El compilador se ha dado cuenta de que existe la posibilidad de que pueda usar match sin que se le haya asignado nada. Es posible que el ciclo foreach nunca se ejecute. Entonces has declarado la variable, pero el compilador se dio cuenta de que se puede acceder sin que se le asigne, de ahí el error.

5

depende de su escenario, sin embargo:

string match = null; 

O:

string match = string.Empty; 

son ambas prácticas aceptables.

En su caso, es posible que match nunca tenga un valor asignado, por lo tanto, el error del compilador.

1

Tiene el bloque if() allí que inicializaría la variable 'coincidir' si se cumple la condición. En ese caso, la coincidencia es un objeto que representa un bloque real en la memoria.

Sin embargo, si no se cumple la condición if(), no hay ningún bloque 'else' que realice una inicialización predeterminada de la variable 'coincidencia', en cuyo caso intentará acceder a un archivo no inicializado objeto, que fallaría.

se puede solucionar este problema:

  1. Como te comento, por defecto inicializar 'partido' antes de que el bucle para.
  2. Añadiendo una condición 'else' por defecto después del for-loop.

Afortunadamente si está trabajando en un IDE, esto lo señala como una excepción de compilación.

Cuestiones relacionadas