Почему C # List <T>. Видимо возвращает NullReferenceException? - PullRequest
1 голос
/ 15 января 2009

Во-первых, согласно http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx, метод List.Find указан только как выбрасывающий ArgumentNullException. Однако у меня есть следующий тестовый код, который при использовании Find с анонимным делегатом выдает исключение 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;
    }
  }
}

Я не понимаю, почему я получаю исключение NullReferenceException вместо Find, просто не найдя элемент и возвращая null. Я на 90% уверен, что это небольшая ошибка кодирования с моей стороны, которую я просто не видел, но это беспокоило меня весь день, пожалуйста, помогите!

EDIT: Я должен упомянуть, что я унаследовал этот извилистый код от кого-то другого, поэтому извилистый код, который вы видите выше, является несколько упрощенной версией того, что не удалось в моем реальном коде.

Ответы [ 2 ]

22 голосов
/ 15 января 2009

Find равно , возвращая ноль. Но тогда вы разыменовываете этот результат. То есть вы вызываете:

Find(...).value

4 голосов
/ 15 января 2009

У вас много всего происходит в одном месте - я бы посоветовал вам немного упростить его, чтобы вы могли точно видеть, что происходит не так.

Более простая версия вашего Find вызова такова:

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

Что произойдет, если ваш Predicate<A> вернет false? objArray возвращает вам ссылку null и ей назначается a. Теперь ясно, что использование a приведет к NullReferenceException.

...