【问题标题】:Why does C# List<T>.Find seemingly return NullReferenceException?为什么 C# List<T>.Find 看似返回 NullReferenceException?
【发布时间】:2009-01-15 19:01:00
【问题描述】:

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

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

【问题讨论】:

    标签: c# generics containers


    【解决方案1】:

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

    Find(...).value

    【讨论】:

    • 你完全正确!有时维护别人复杂的代码会很臭!
    【解决方案2】:

    你有很多事情发生在一个地方 - 我建议你稍微简化一下,这样你就可以准确地看到哪里出了问题。

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

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

    如果您的Predicate&lt;A&gt; 返回false,会发生什么? objArray 返回一个 null 引用,a 被分配给它。现在可以清楚地看到使用a 会导致NullReferenceException

    【讨论】:

    • 我也碰到了你的答案,因为这是迈向塞缪尔解决方案的一步。我从别人那里继承了这个复杂的代码,所以我应该按照你的建议简化它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    相关资源
    最近更新 更多