首先,根据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%肯定这是我的一些微妙的编码错误,我只是没有看到,但这一直困扰着我,请帮忙!
编辑: 我应该提一下,我从其他人那里继承了这个复杂的代码,所以你在上面看到的曲折代码是我真实代码中失败的一些简化版本。
答案 0 :(得分:22)
Find
返回null。但是你要取消引用那个结果。也就是说,你正在调用:
Find(...).value
答案 1 :(得分:4)
你在一个地方有很多东西 - 我建议你稍微简化一下,这样你就可以看到出了什么问题。
Find
调用的更简单版本是:
A a1 = objArray.Find(a => a.name == findStr);
如果Predicate<A>
返回false
会怎样? objArray
会向您返回null
引用,并为其分配a
。现在很明显,使用a
会导致NullReferenceException
。