Pourquoi C # List < T > .Find semble-t-il apparemment renvoyer une exception NullReferenceException?

StackOverflow https://stackoverflow.com/questions/448002

  •  19-08-2019
  •  | 
  •  

Question

Tout d’abord, selon http://msdn.microsoft.com/ en-us / library / x0b5b5bc.aspx , la méthode List.Find est uniquement répertoriée en tant que levée de ArgumentNullException. Cependant, j’ai le code de test suivant qui, lorsqu’il utilise Find avec un délégué anonyme, lève une exception NullReferenceException lorsque l’objet recherché est introuvable.

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;
    }
  }
}

Je ne comprends pas pourquoi je reçois une exception NullReferenceException au lieu de la recherche. Je ne trouve pas l'élément et ne renvoie pas null. Je suis sûr à 90% que c'est une erreur de codage subtile de ma part que je n'ai pas vue, mais cela m'a dérangé toute la journée, aidez-moi s'il vous plaît!

EDIT: Je dois mentionner que j'ai hérité de ce code compliqué de quelqu'un d'autre. Le code sinueux que vous voyez ci-dessus est une version quelque peu simplifiée de ce qui ne fonctionne pas dans mon code réel.

Était-ce utile?

La solution

Rechercher est renvoyant la valeur null. Mais alors vous déréférenciez ce résultat. C'est-à-dire que vous appelez:

Rechercher (...). valeur

Autres conseils

Vous avez beaucoup de choses qui se passent au même endroit - je vous suggérerais de les simplifier un peu pour que vous puissiez voir exactement ce qui ne va pas.

Voici une version simplifiée de votre invocation Find :

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

Que se passe-t-il si votre prédicat < A > renvoie false ? objArray vous renvoie une référence null et un code lui est attribué. Maintenant, il est clair que l'utilisation de a provoquera une NullReferenceException .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top