2012-09-04 5 views
26

tengo el siguiente código que le da una advertenciaposible referencia involuntaria comparación

Posible referencia de comparación no deseado; para obtener una comparación de valor, emitir el lado izquierdo para escribir 'string'`

if (lblStatus.Content == "ACTIVE") 
{ 
    //Do stuff 
} 
else 
{ 
    //Do other Stuff 
} 

Asumo la advertencia se debe a lblStatus.Content no necesariamente siempre pueden ser de tipo cadena?

he tratado de fijarla con cada uno de los siguientes, pero todavía consigo una advertencia

if (lblStatus.Content.ToString() == "ACTIVE") 
if ((string)lblStatus.Content == "ACTIVE") 
if (lblStatus.Content === "ACTIVE") 

Por favor, alguien podría explicar la razón por la que todavía consigo una advertencia y la mejor manera práctica para hacer frente a esto?

+3

Sus primeros dos correcciones no van a dar una advertencia, y el tercero no se compilará. – SLaks

+0

Las dos primeras modificaciones deberían haber solucionado el problema. ¿Intentó recompilar? – Heinzi

+2

¿Cuál es el tipo de lblStatus? Me parece un WPF o un Silverlight TextBox. ¿Es esto correcto? – akton

Respuesta

51

La advertencia se debe a la en tiempo de compilación tipo de lblStatus.Content es object. Por lo tanto, la sobrecarga del operador elige la sobrecarga ==(object, object), que es solo una comparación de identidad de referencia. Esto no tiene nada que ver con lo que el tiempo de ejecución - tipo del valor es.

La primera o la segunda de las opciones debe han fijado la advertencia:

if (lblStatus.Content.ToString() == "ACTIVE") 
if ((string)lblStatus.Content == "ACTIVE") 

Tenga en cuenta que el primero de ellos producirá una excepción si lblStatus.Content es nulo. Preferiría la segunda forma.

Si usted cree que aún se está viendo una advertencia en ese punto, sospecho que o bien no se ha reconstruido - o algo todavía está "sucia" en su construcción. Una reconstrucción completa absolutamente debe quitar la advertencia.

+0

"..._ compile-time_ type of' lblStatus.Content' es una cadena "- not' object'? – Rawling

+1

@Rawling: Al parecer, hoy es el día de los múltiples errores tipográficos :( –

+0

Gracias a todos - que sólo necesitaba una reconstrucción para eliminar el aviso @ Jon gracias por la información útil sobre si 'lblStatus..El contenido' es nulo. – user3357963

0

que prefieren quedarse en un método string.Equals(string,string,StringComparison), como la siguiente:

string contentStr = (lblStatus.Content ?? string.Empty).ToString(); 
    if (string.Equals("ACTIVE", contentStr, StringComparison.OrdinalIgnoreCase)) 
    { 
     // stuff 
    } 

ya que explícitamente establece lo que hace + no da una advertencia que usted ha mencionado.

+1

Su código no logra lo mismo: no distingue entre mayúsculas y minúsculas sin ningún motivo obvio. Sí, puede * hacer * que distinga entre mayúsculas y minúsculas, pero luego es solo una forma realmente larga de lograr lo mismo, * y * dará un resultado diferente si 'lblStatus.Content' es inesperadamente un tipo no de cadena cuyo método 'ToString' devuelve" ACTIVE ". –

+0

>> dará un resultado diferente si lblStatus.Content es inesperadamente un tipo de cadena cuyo método ToString resulta ser "ACTIVO". - Buen punto, no pensé en eso. –

+0

Lo bueno de esto es que no se produce ninguna excepción si 'Content' es un objeto que no es una cadena (y cuya implementación' ToString() 'no es completamente mala), o si' Content' es 'null'. Pero es un poco detallado. –

-1

reconstruir su proyecto después de arreglar su código con esto:

if (lblStatus.Content.ToString() == "ACTIVE") 
if ((string)lblStatus.Content == "ACTIVE") 
if (lblStatus.Content === "ACTIVE") 
Cuestiones relacionadas