Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 图片框的标记在if语句中不起作用_C#_Winforms_Picturebox - Fatal编程技术网

C# 图片框的标记在if语句中不起作用

C# 图片框的标记在if语句中不起作用,c#,winforms,picturebox,C#,Winforms,Picturebox,我正在做一个记忆游戏,比较两张牌和它们自己,看它们是否相同。我通过比较图片框中图像的标签来实现这一点。所有图像都有唯一的标记,但是,当在if语句中进行比较时,它会传递并将其视为false。这是单击卡时的代码 private void pictureBox1_Click(object sender, EventArgs e) { Image temp = Boxes[0]; pictureBox1.Tag = Boxes[0].Tag; pi

我正在做一个记忆游戏,比较两张牌和它们自己,看它们是否相同。我通过比较图片框中图像的标签来实现这一点。所有图像都有唯一的标记,但是,当在if语句中进行比较时,它会传递并将其视为false。这是单击卡时的代码

private void pictureBox1_Click(object sender, EventArgs e)
    {
        Image temp = Boxes[0];
        pictureBox1.Tag = Boxes[0].Tag;
        pictureBox1.Image = temp;
        if (openBox1 == null)
        {
            openBox1 = pictureBox1;
        }
        else if (openBox1 != null && openBox2 == null)
        {
            openBox2 = pictureBox1;
        }
        if (openBox1 != null && openBox2 != null)
        {
            if (openBox1.Image.Tag == openBox2.Image.Tag)
            {
                openBox1 = null;
                openBox2 = null;
            }
            else
            {
                openBox1.Image = Properties.Resources.card;
                openBox2.Image = Properties.Resources.card;
                openBox1 = null;
                openBox2 = null;
            }
        }
    }
这就是我标记图像的方式:

List<int> Repeats = new List<int>();
        int random;
        bool test;
        foreach (Image n in Album)//checks to see if image has been added 
        {
            test = true;
            while (test)
            {
                random = randy.Next(0, 16);


                if (!Repeats.Contains(random))
                {
                    Boxes[random] = n;
                    Boxes[random].Tag = n.Width * n.Height;
                    Repeats.Add(random);
                    test = false;
                }
            }

        }
List Repeats=新列表();
int随机;
布尔试验;
foreach(相册中的图像n)//检查是否已添加图像
{
测试=真;
while(测试)
{
random=randy.Next(0,16);
如果(!Repeats.Contains(随机))
{
盒子[随机]=n;
框[random]。标记=n.宽度*n.高度;
重复。添加(随机);
测试=假;
}
}
}

我亲自参与了这个项目,并监控了变量。当我点击同一张牌的两张时,它只会忽略它们是相同的值

由于装箱,代码不起作用
int
是一种值类型,用于将其强制转换为
对象
(标签接受的类型)。net使用新的
对象
(“框”它)包装值类型。由于
object
是一种引用类型,并且每个标记都有一个不同的对象,因此不满足相等性

要使其正常工作,必须通过类型转换或使用运算符
as
,取消对值的装箱:

//Unbox values before comparing
if (openBox1.Image.Tag as integer == openBox2.Image.Tag as integer)
    //...

标记
具有类型
对象
。编写
时,如果(…Tag==…Tag)
比较的是引用,而不是值。@AlexanderPetrov那么我是否必须首先将标记值转换为int才能工作?或者不可能这样做。是的,将/cast
Tag
转换为
int