سؤال

أولا ، وفقا ل http://msdn.microsoft.com/en-us/library/x0b5b5bc.aspx, ، يتم سرد طريقة القائمة. ومع ذلك ، لدي رمز الاختبار التالي والذي ، عند استخدام 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 بدلاً من العثور على عدم العثور على العنصر وإرجاع الفارغ. أنا متأكد من 90 ٪ من خطأ الترميز الدقيق من جانبي لم أره للتو ، لكن هذا كان يزعجني طوال اليوم ، الرجاء المساعدة!

تحرير: يجب أن أذكر أنني ورثت هذا الكود المعاد تشكيل شخص آخر ، لذلك فإن الكود الملتوي الذي تراه أعلاه هو نسخة مبسطة إلى حد ما من الفشل في الكود الحقيقي.

هل كانت مفيدة؟

المحلول

Find هو عودة لاغية. ولكن بعد ذلك أنت تضعف هذه النتيجة. هذا هو ، أنت تستدعي:

Find(...).value

نصائح أخرى

لديك الكثير من الأشياء التي تحدث في مكان واحد - أود أن أقترح عليك تبسيطها قليلاً حتى تتمكن من رؤية ما يحدث بالضبط.

نسخة أبسط من Find الاحتجاج هذا:

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

ماذا يحدث إذا Predicate<A> عائدات false؟ ال objArray يعيدك أ null المرجع و a تم تعيينه لها. الآن من الواضح أن نرى ذلك باستخدام a سوف يسبب أ NullReferenceException.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top