【发布时间】:2020-02-06 19:08:52
【问题描述】:
我正在用 C# (WPF) 制作一个 noughts and crosss 游戏。这部分代码是玩家选择方块放入下一块后发生的事情的一部分 - 它使用一种方法将方块的坐标转换为单个整数,它可以与每个图像的标签 (1-9) 进行比较以找到正确的图像,然后它会更改其来源。图片、来源和标签是 WPF 特有的,但对这个问题来说重要的是我有一个图片列表,每个图片都有一个标签,它是一个对象。
int coordNumber = ReturnNumber(coordinates); //get integer version of coordinates, equivalent to clickedSquare
string coordString = coordNumber.ToString();
object coordObject = coordString;
SquareImages.First(image => image.Tag == coordObject).Source = new ImageSourceConverter().ConvertFromString("Data/Images/Cross.png") as ImageSource;
最后一行的.Source 部分不相关,因为它发生在错误之后。第二行和第三行是试图看看不同的投射方式是否会改变它是否可以找到具有正确标签的图像,但到目前为止还没有导致任何变化。两行已被删除,但不会以任何方式影响列表或显示的变量。
【问题讨论】:
-
比较对象时,唯一的比较是它们是否引用了完全相同的对象。它不会进行字符串比较。你可以这样做:
image.Tag?.ToString() == coordString -
Tag是object类型,所以如果你把int塞进去,它就是boxed。这意味着无论int的值如何,每个Tag都有一个单独的对象。 (当您使用==比较引用类型对象时,默认情况下它是引用值的比较,即底层指针) -
这能回答你的问题吗? Compare String and Object in C#
-
如果
image.Tag是object类型,但您确定它实际上包含一个 int,请取消装箱该 int,并将其与您的coordNumber进行比较,如下所示:SquareImages.First(image => (int)image.Tag == coordNumber)。