我正在练习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窗体
答案 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++;
}
在这种情况下,您可以更好地阅读代码。