Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

923
Vistas
La forma más elegante de dejar de recibir CS8602 en VS2022, .NET 6, C# 10

Tengo el siguiente código de muestra en VS 2022, C# .NET 6.0:

 using System.Xml; XmlDocument doc = new XmlDocument(); doc.LoadXml("<root/>"); foreach (XmlNode node in doc.SelectNodes("aaa")) Console.WriteLine(node.OuterXml);

y obtengo "CS8602: Desreferencia de una referencia posiblemente nula" en la línea doc.SelectNodes. El código funciona en el sentido de que no falla sino que simplemente no hace nada cuando no encuentra un nodo llamado 'aaa'. Si pongo 'root', lo encuentra. Entonces, por lo que veo, no estoy haciendo nada malo y ofendiendo al compilador.

Sin embargo, la advertencia está ahí y parece incorrecta y, por lo tanto, molesta. Mis dos preguntas son:

  1. ¿Es un error en la lógica de advertencia del compilador?
  2. ¿Existe una forma mejor (es decir, breve, no superflua) de escribir un código similar que busque todos los nodos que coincidan con una determinada consulta XML y procesarlos sin generar la advertencia?

Descubrí que solo puedo agregar "#pragmaadvertencia deshabilitar CS8602", pero eso no parece una gran solución. Lo ideal sería aprovechar esta advertencia en otros casos que me parecen legítimos a diferencia de este.

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿Cuál es la forma más elegante de dejar de recibir el error?
En su archivo de proyecto, elimine <Nullable>enable</Nullable>

¿Es un error en la lógica de advertencia del compilador?
No

¿Hay una forma mejor (es decir, breve, no superflua) de escribir un código similar?
"Mejor" es subjetivo. Creo que su código está bien, pero esto es lo que la advertencia quiere que haga:

 XmlDocument doc = new XmlDocument(); doc.LoadXml("<root/>"); var nodes = doc.SelectNodes("aaa"); if (nodes == null) { //handle this case here return; } foreach (XmlNode node in nodes) Console.WriteLine(node.OuterXml);

O podrías hacer algo como esto:

 XmlDocument doc = new XmlDocument(); doc.LoadXml("<root/>"); foreach (var node in Enumerate(doc.SelectNodes("aaa"))) Console.WriteLine(node.OuterXml);

 private static IEnumerable<XmlNode> Enumerate(XmlNodeList? list) { if (list == null) yield break; foreach (XmlNode item in list) { yield return item; } }
over 4 years ago · Santiago Trujillo Denunciar

0

Ahora entiendo que, como comentó GSerg , el método API que se declara como XmlNodeList? (cadena) es la fuente de la advertencia (sin embargo, nunca devuelve un valor nulo; devuelve una referencia no nula a una lista vacía).

Mi solución subjetiva "más elegante" que encontré hasta ahora es hacer esto:

 #pragma warning disable CS8602 foreach (XmlElement item in doc.SelectNodes("...")) #pragma warning restore CS8602

porque eso suprime justamente esta instancia, y puedo beneficiarme de otras instancias de esta advertencia que, me atrevo a decir, son más legítimas.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda