C# List<T>.Find が NullReferenceException を返すように見えるのはなぜですか?

StackOverflow https://stackoverflow.com/questions/448002

  •  19-08-2019
  •  | 
  •  

質問

まず、によると、 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;
    }
  }
}

Find ではなく NullReferenceException が発生し、項目が見つからず null が返される理由がわかりません。90% の確率で、私が気づいていないだけの、私の側の微妙なコーディング エラーであると確信しています。でも、これは一日中私を悩ませています。助けてください。

編集:この複雑なコードは他の人から受け継いだものであるため、上記の複雑なコードは、実際のコードで失敗している部分をいくらか簡略化したものであることを言っておきます。

役に立ちましたか?

解決

Find nullを返します。しかし、その結果を逆参照することになります。つまり、次のように呼び出しています。

Find(...).value

他のヒント

1か所で多くのことが行われています。何が問題になっているのかを正確に確認できるように、少し単純化することをお勧めします。

Find呼び出しのより単純なバージョンは次のとおりです: ジェネラコディセタグプレ

Predicate<A>falseを返すとどうなりますか?objArrayは、null参照を返し、aがそれに割り当てられます。これで、aを使用するとNullReferenceExceptionが発生することがわかります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top