1

首先,根据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% 确定这是我从未见过的一些细微的编码错误,但这一直困扰着我一整天,请帮忙!

编辑:我应该提到我从别人那里继承了这个令人费解的代码,所以你在上面看到的曲折代码是我真实代码中失败的一个稍微简化的版本。

4

2 回答 2

22

Find 正在返回 null。但是,您正在取消引用该结果。也就是说,您正在调用:

Find(...).value

于 2009-01-15T19:07:55.273 回答
4

您在一个地方发生了很多事情 - 我建议您稍微简化一下,以便您可以准确地看到出了什么问题。

Find您的调用的一个更简单的版本是这样的:

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

如果您的Predicate<A>退货会false怎样?向objArray您返回一个null引用并a分配给它。现在可以清楚地看到 usinga会导致NullReferenceException.

于 2009-01-15T19:14:50.987 回答