2017-08-29 25 views
1

我正在練習C#編程,我正在學習一個我在網上找到的教程。我對Visual Studio女士感興趣,並且目前正在進行自我教育。我已經從教程中完成了自己的編輯,但儘可能接近教程。一切似乎都很好,除了代碼中有一部分我不知道我做了什麼或研究。在教程中,它使我創建了我認爲30個圖片盒。每個圖片框都被標記爲塊名或磚塊的字名,或者您選擇。我認爲這是爲了讓所有圖片框一次而不是一次一個地執行if/else語句更容易。我明白如果說「如果picturebox有標籤」磚塊「然後做XYZ,那麼花費的時間會更少。」 無論如何,我將代碼跟在T上,但是visualbasic說的是在Visual Studio中使用帶有圖片框的標籤

「可能的意外引用comprarison;得到一個值比較,投左側鍵入「串」

這裏是代碼的一部分,這給我這個

foreach (Control x in this.Controls) 
     { 
      if (x is PictureBox && x.Tag == "blockies") 
      { 
       if (pBall.Bounds.IntersectsWith(x.Bounds)) 
       { 
        this.Controls.Remove(x); 
        pBally = -pBally; 
        score++; 
       } 
      } 
     } 

它有一個綠色的波浪線從x.Tag到blockies」 。 感謝所有幫助 PS Windows窗體

+0

'但VisualBasic中被saying'這裏是VB代碼? –

+0

這幾乎是說上面引號。 – Razgr1z

+0

我看到它,但沒有任何與VB相關的東西。它是C# –

回答

1

這是因爲Tag不是一個字符串你需要做的,而不是x.Tag.ToString() == "blockies"

foreach (Control x in this.Controls) 
{ 
    if (x is PictureBox && x.Tag != null && x.Tag.ToString() == "blockies") 
    { 
     if (pBall.Bounds.IntersectsWith(x.Bounds)) 
     { 
      this.Controls.Remove(x); 
      pBally = -pBally; 
      score++; 
     } 
    } 
} 
+0

如果我這樣做,我得到System.NullReferenceException:'對象引用未設置爲對象的實例。' System.Windows.Forms.Control.Tag.get返回null。 – Razgr1z

+0

@ Razgr1z在調用'ToString()'之前檢查'x.Tag!= null'。發生這種情況時,您的標籤爲空。我編輯了我的答案來反映這個 –

0

如果您打開Control.Tag,您將看到它的定義。

public object Tag { get; set; } 

您試圖將對象與字符串進行比較,因此會顯示此錯誤消息。

你應該做的是:

if (x is PictureBox && x.Tag.ToString() == "blockies") 

還有一點你應該儘量避免箭頭代碼結構,這是真的很難閱讀:

foreach (Control x in this.Controls) 
    { 
     if (!(x is PictureBox)) 
      continue; 

     //this is needed if you want to use some specific property of the PictureBox. 
     PictureBox ctl = (PictureBox)x; 

     if(ctl.Tag.ToString() != "blockies") 
      continue; 

     if (!pBall.Bounds.IntersectsWith(ctl.Bounds)) 
      continue; 

     //Also this line will create you a problem, because you will change the Control collection 
     //when you try to enumerate it. This should throw you an exception. Better make the control not visible. 
     //this.Controls.Remove(x); 

     x.Visible = false; 

     pBally = -pBally; 
     score++; 
    } 

在這種情況下,你有更好的可讀性代碼。

+0

你能解釋一下爲什麼你低估了我,謝謝。 – mybirthname

+0

不是我的倒計時,但你的三重'繼續'可能不是每個人的口味。 – TaW

1

我發現使用Linq更具可讀性。

修復您的問題進行比較警告,而在它枚舉從集合中移除元素的問題:

foreach(var pb in this.Controls 
        .OfType<PictureBox>() 
        .Where(x => (string)x.Tag == "blockies") 
        .Where(x => pBall.Bounds.IntersectsWith(x.Bounds)) 
        .ToList()) 
{ 
    this.Controls.Remove(pb); 
} 
+0

嗨,感謝您的回覆!不幸的是,當我使用這些代碼時,圖片盒一下子開始泛白。我應該在開始時聲明我正在用這種類型的代碼製作一個塊遊戲。還有什麼我應該提供修復?謝謝 – Razgr1z

+0

當我添加你的代碼時,「球」不再反彈了。 – Razgr1z

+0

@ Razgr1z此代碼與您發佈並修復問題的代碼類似。你現在問不同的東西,我不知道你的代碼,如果你有一個邏輯錯誤。 – Eser

相關問題