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:
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.
¿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; } }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 CS8602porque eso suprime justamente esta instancia, y puedo beneficiarme de otras instancias de esta advertencia que, me atrevo a decir, son más legítimas.