0
foreach (Control c in panPrev.Controls)
{
if (c.Tag == "move")

正常に機能しますが、警告が表示されます。意図しない参照比較の可能性があります。値の比較を取得するには、左側をキャストして「string」と入力します

foreach (Control c in panPrev.Controls)
{
if (c.Tag.ToString() == "move")  // this produce NullReferenceException.

何をすべきか?

4

3 に答える 3

5

あなたは警告によって提供された提案を受け入れませんでした。次のようになります。

if ((string)c.Tag == "move")

これは、null のイベントでは正常に機能しますが、参照の可能性がある場合Tagに呼び出そうとすると、例外が発生する可能性があります。 .ToStringnull

これを行う必要がある理由.Tagは、 が として宣言されているobjectため、 anと a の==間で演算子を使用すると参照の等価性が使用されるのに対し、 a と aを比較すると、 defined inのオーバーロードが実装され、実際の値を比較するために使用されるためです。objectstringstringstring==string

于 2012-06-22T20:08:53.670 に答える
1

Tagはタイプobjectであるため、警告が表示されます。それが文字列であることがわかっていて、常にTag文字列でなければならない場合は、それをキャストする必要があります (C スタイル) 。これは、文字列でない (ただし、文字列である必要がある)場合にエラーをすばやくキャッチするためです。

于 2012-06-22T20:10:29.077 に答える
1

c.Tagはオブジェクトなので、 object == string は参照比較を行います。

もちろん、オブジェクトは null になる可能性があるため、その場合、呼び出しTag.ToString()によって null 参照例外がスローされる可能性があります。

警告が示唆するようにして、Tag文字列にキャストする必要があります。

if ((string)c.Tag == "move")
于 2012-06-22T20:10:39.550 に答える