在Visual Studio

时间:2017-08-29 21:45:21

标签: c# visual-studio-2017

我正在练习C#编程,我正在按照我在网上找到的教程。我发现对Visual Studio女士很感兴趣,并且此刻一直在自我教学。我已经从教程中完成了自己的编辑,但是尽可能接近教程。一切似乎都很好,除了代码中有一部分,无论我做什么或研究,我都无法弄清楚。在教程中它让我创造了我认为30个图片框。每个图片框都标记了一个单词名称,如块或砖,或者您选择。我认为这样可以更容易地同时使用所有图片框的if / else语句,而不是一次一个。据我所知,如果图片盒上有标签"砖块,那就不那么费时了。然后做XYZ。 无论如何,我遵循代码到T,但是visualbasic正在说

"可能是无意的参考评估;要获得值比较,请将左侧投射到键入'字符串'

这是我给你的代码部分

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窗体

3 个答案:

答案 0 :(得分: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++;
        }
    }
}

答案 1 :(得分: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);
}

答案 2 :(得分: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++;
    }

在这种情况下,您可以更好地阅读代码。