2009-01-15 15 views
1

Tout d'abord, selon http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx, la méthode List.Find est répertoriée uniquement comme argument ArgumentNullException. Cependant, j'ai le code de test suivant qui, en utilisant Find avec un délégué anonyme, lance une exception NullReferenceException lorsque l'objet recherché n'est pas trouvé.Pourquoi C# Liste <T> .Find semble retourner NullReferenceException?

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 un NullReferenceException au lieu de la Trouver tout simplement pas trouver l'élément et retourner 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! Je dois mentionner que j'ai hérité de ce code compliqué de quelqu'un d'autre, donc le code sinueux que vous voyez ci-dessus est une version quelque peu simplifiée de ce qui échoue dans mon code réel.

Répondre

22

Findest renvoyant la valeur null. Mais alors vous déréférencer ce résultat. Autrement dit, vous invoquez:

Find(...).value

+0

Vous avez parfaitement raison! Parfois, ça pue le maintien du code alambiqué de quelqu'un d'autre! –

4

Vous avez beaucoup de choses qui se passent dans un seul endroit - je dirais que vous simplifiez un peu afin que vous puissiez voir exactement ce qui se passe mal.

Une version simplifiée de votre Find invocation est la suivante:

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

Qu'advient-il si vos Predicate<A> retours false? Le objArray vous renvoie une référence null et a lui est affectée. Maintenant, il est clair de voir que l'utilisation a provoquera un NullReferenceException.

+0

J'ai aussi trouvé votre réponse car c'est un pas vers la solution de Samuel. J'ai hérité de ce code compliqué de quelqu'un d'autre, donc j'aurais dû le simplifier pour commencer, comme vous l'avez suggéré. –