Domanda

Prima di tutto, secondo http://msdn.microsoft.com/ it-us / library / x0b5b5bc.aspx , il metodo List.Find è elencato solo come lancio ArgumentNullException. Tuttavia, ho il seguente codice di prova che, quando si utilizza Trova con un delegato anonimo, genera un'eccezione NullReferenceException quando l'oggetto da cercare non viene trovato.

namespace MyTestNS
{
  class MyTestClass
  {
    [TestMethod()]
    public void ArrayMatchTest()
    {
        List<A> objArray = new List<A>();
        objArray.Add(new A("1","one"));
        objArray.Add(new A("2", "two"));

        string findStr = "3";
        string foundVal;
        // Find using an anonymous delegate:
        foundVal = objArray.Find(delegate(A a) // <- System.NullReferenceException: Object reference not set to an instance of an object..
        {
            if (a.name == findStr)
                return true;
            else return false;
        }).value;
    }
  }
}

Non capisco perché sto ottenendo una NullReferenceException invece di Trova semplicemente non trovando l'elemento e restituendo null. Sono sicuro al 90% che è un errore di codifica sottile da parte mia che non ho visto, ma questo mi ha infastidito tutto il giorno, per favore aiutatemi!

EDIT: Devo dire che ho ereditato questo codice contorto da qualcun altro, quindi il codice contorto che vedi sopra è una versione un po 'semplificata di ciò che non riesce nel mio codice reale.

È stato utile?

Soluzione

Trova sta restituendo null. Ma poi stai dereferenziando quel risultato. Cioè, stai invocando:

valore Trova (...).

Altri suggerimenti

Hai un sacco di cose da fare in un posto - ti suggerirei di semplificarlo un po 'in modo da poter vedere esattamente cosa non va.

Una versione più semplice della tua chiamata Trova è questa:

A a1 = objArray.Find(a => a.name == findStr);

Cosa succede se il tuo Predicate < A > restituisce false ? objArray restituisce un riferimento null e gli viene assegnato a . Ora è chiaro che l'uso di a provocherà un NullReferenceException .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top