سؤال
أولا ، وفقا ل 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
.