C# List<T>.Find が NullReferenceException を返すように見えるのはなぜですか?
-
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
が発生することがわかります。