2010-12-09 28 views
7
int i, j; 
i = j = 1; 

j se destaca por VS 2010 con la advertencia: se asignaLa variable pero nunca utilizado

La variable pero nunca utilizado

Por qué i es "usado" y j - ¿no es?


Una adición de cooperación con Daniel:

int i, j, k, l, m; 
i = j = k = l = m = 1; 

Sólo m está resaltado.

+0

Para aclarar, los pasos para reproducir son (1) crear un nuevo proyecto de tipo Aplicación de consola, y (2) agregar este código y nada más dentro del cuerpo de main. –

+0

Esto parece un error intellisense. Por cierto, nunca supe que podrías usar más de un '=', supongo que nunca lo necesité: P –

+0

@Camilo: Es un tipo de estilo C de declaración/asignación de variables – abatishchev

Respuesta

5

Creo que es un error, que debería estar en el orden inverso, = operator is a right precedent operator según la documentación de Microsoft. Entonces cuando tenemos i = j = 1 debería analizarlo como i = (j = 1) en este caso el valor de j usado para inicializar i por lo que el compilador debe decir i iniciado pero nunca usado, no j.

+0

+1 Great Saeed :-) –

2

Técnicamente esto debería ser el caso tanto para i y j

EDIT:

I de nuevo comprobado el código

int ii, jj; 
ii = jj = 1; 

usando Reflector para generar IL encontré

.maxstack 2 
.locals init (
    [0] int32 ii, 
    [1] int32 jj) 
L_0000: nop 
L_0001: ldc.i4.1 //pushes the integer value of 1 onto the evaluation stack 
L_0002: dup //copies the current topmost value on the evaluation stack, and then pushes the copy 
L_0003: stloc.1 
L_0004: stloc.0 
L_0005: ret 

De esto, parecería que 1 está asignado a ii, y luego ii es copiado a jj.

+0

¡Sí, estoy de acuerdo! Entonces, la pregunta es: ¿alguien tiene alguna sugerencia sobre por qué ocurre y no al revés? – abatishchev

+0

Si usa Reflector en dicho método, notará que el código se optimiza. El cuerpo del método está vacío. Y también, Resharper muestra la advertencia en ambas variables. –

+0

¿No se usa j para asignar i? Si asigno un valor inicial a j, podría, por ejemplo, hacer –

1

Esto es una limitación del compilador de Visual Studio C#. No podemos responder porque no lo hemos implementado.


Respuesta original

i se utiliza probablemente más adelante en su función, mientras que j no lo es.

Para eliminar el "probablemente", debe publicar toda la función. (Actualización: Esto no es cierto. Todo el código dentro de main es lo que el OP publicó.)

+2

Esto es solo código. Inténtalo :) Crea una nueva aplicación de consola y copia y pega el código allí. La advertencia debería aparecer – abatishchev

+0

Tiene razón. En realidad, con "int i, j, k, l, m; i = j = k = l = m = 1;", solo m está "asignado pero nunca usado". –

+0

¿Es IntelliSense error? – abatishchev

-1

Intenté esto en Visual Studio 2010 Professional y no recibí tal advertencia. ¿Qué sabor de VS2010 estás usando? Utilizo Professional at work y Express at home, y encuentro que la versión Express es menos precisa con advertencias.

+0

Utilicé VS 2010 Ultimate – abatishchev

1

Lo he probado con Resharper y es lo suficientemente inteligente como para dar advertencias para todas las variables correctamente.

+1

¡Felicitaciones a Resharper! Estos chicos superan en rendimiento al equipo de desarrollo VS a veces. –

1

En realidad, el comportamiento previsto para i no se resalta como advertencia, ya que se inicializa a partir del valor de una variable.Esta advertencia solo se da cuando la variable se asigna desde una constante de tiempo de compilación.

intente con el siguiente código:

int i = 0; 
string s = "string"; 
string t = "another string"; 
string u = t; 
var v = new string('v', 1); 
var y = new XElement("hello"); 

advertencias Sólo i y s están dadas. De acuerdo con this post, esto está destinado (aunque por una razón bastante cuestionable IMO).

Así que realmente el misterio aquí es por qué hay advertencias en absoluto!

Cuestiones relacionadas