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;
    }
  }
}

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

編集:私はこの複雑なコードを他の誰かから継承したことを言及する必要があります。したがって、上記のねじれたコードは、実際のコードで失敗したもののやや単純化されたバージョンです。

4

2 に答える 2

22

Find nullを返しています。しかし、その結果を逆参照しています。つまり、呼び出しているのは次のとおりです。

Find(...).value

于 2009-01-15T19:07:55.273 に答える
4

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

Find呼び出しのより単純なバージョンは次のとおりです。

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

Predicate<A>返品した場合はどうなりますfalseか? は参照をobjArray返し、それに割り当てられます。を使用すると.nullaaNullReferenceException

于 2009-01-15T19:14:50.987 に答える