C# 为什么C List.Find似乎返回NullReferenceException?

C# 为什么C List.Find似乎返回NullReferenceException?,c#,generics,containers,C#,Generics,Containers,首先,根据,List.Find方法仅列为抛出ArgumentNullException。但是,我有以下测试代码,当对匿名委托使用Find时,如果未找到要搜索的对象,则会抛出NullReferenceException namespace MyTestNS { class MyTestClass { [TestMethod()] public void ArrayMatchTest() { List<A> objArray = new L

首先,根据,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%肯定这是我自己的一些细微的编码错误,我只是没有看到,但这一直困扰着我一整天,请帮助

编辑: 我应该提到的是,我从其他人那里继承了这个复杂的代码,因此您在上面看到的扭曲代码是我的真实代码中失败的部分的简化版本。

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

Find…value

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


发现……价值

你在一个地方有很多事情要做——我建议你把它简化一点,这样你就可以确切地看到哪里出了问题

查找调用的更简单版本如下:

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

如果谓词返回false怎么办?objArray返回一个空引用,并为其分配了一个。现在可以清楚地看到,使用a将导致NullReferenceException。

您在一个地方有很多事情要做-我建议您将其简化一点,以便您可以准确地看到哪里出了问题

查找调用的更简单版本如下:

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

如果谓词返回false怎么办?objArray返回一个空引用,并为其分配了一个。现在可以清楚地看到,使用将导致NullReferenceException。

您完全正确!有时候维护别人复杂的代码很糟糕!你完全正确!有时候维护别人复杂的代码很糟糕!我也不同意你的回答,因为这是朝着塞缪尔的解决方案迈出的一步。我从其他人那里继承了这个复杂的代码,所以我应该按照你的建议从一开始就简化它。我从其他人那里继承了这个复杂的代码,所以我应该按照你的建议从一开始就简化它。