2012-06-22 49 views
0
foreach (Control c in panPrev.Controls) 
{ 
if (c.Tag == "move") 

工作正常,但會產生警告:可能的非預期的參考比較;得到一個值比較,投左側鍵入「串」比較警告vs NullreferenceException

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

怎麼辦?

+4

另一個選項將被重新寫入呼叫作爲'「移動」 .Equals(c.Tag)' – dlev

回答

5

您沒有采取警告提供的建議。具體做法是:

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

這將很好地工作在事件Tag是空的,而試圖在可能null參考調用.ToString打開你到你有例外。

,你需要在所有這樣做的原因是因爲.Tag被聲明爲object,所以使用objectstring之間的==運營商使用引用相等,而比較一個stringstring使用的==超載定義在string中,它被用來比較實際值。

1

Tagobject類型,這就是爲什麼您會收到警告。如果你知道它是一個字符串,它應該總是是一個字符串,那麼你應該投它(C風格),因爲如果Tag不是一個字符串(但應該是),你將很快發現錯誤。

+0

你這是什麼這意味着如果它是一個引擎蓋下的字符串,沒有什麼可擔心的?如果字符串是不同的實例,'=='比較將失敗,沒有強制轉換。 –

+0

@KirkWoll:你說得對,因爲'標籤'屬於'object'類型,我沒有考慮過,寫得太快。我的錯誤,謝謝。 –

1

c.Tag是一個對象,所以object == string做參考比較。

對象可以爲空,當然,所以調用Tag.ToString()可以在這種情況下拋出空引用異常。

的警告提示你應該做的,投Tag串:

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