代码之家  ›  专栏  ›  技术社区  ›  KOPEUE

Windows Phone 8.1正在比较控件。给出错误结果的内容

  •  0
  • KOPEUE  · 技术社区  · 9 年前

    我遇到了一个非常奇怪的问题,我有以下代码:

    for (int i = 0; i < Board.Length - 2; i++)
    {
        var a = Board[i].Content;
        var b = Board[i + 1].Content;
        var c = Board[i + 2].Content;
        if (a == b && a == c &&
            (string) a != string.Empty && a != null)
        {
            MessageDialog msd = new MessageDialog("test");
            await msd.ShowAsync();
        }
    }
    

    哪里 Board 是一个按钮数组,a、b、c具有相同的值“1”。然而,当在if语句中比较它们时,它们都给出了错误?我检查字符串是空还是空的其他语句给出的值为true。

    1 回复  |  直到 9 年前
        1
  •  1
  •   Jason Watkins    9 年前

    您正在执行引用相等比较,而不是值相等比较。您的代码相当于以下内容:

    for (int i = 0; i < Board.Length - 2; i++)
    {
        object a = Board[i].Content;
        object b = Board[i + 1].Content;
        object c = Board[i + 2].Content;
        if (a == b && a == c &&
            (string) a != string.Empty && a != null)
        {
            MessageDialog msd = new MessageDialog("test");
            await msd.ShowAsync();
        }
    }
    

    这意味着 a == b 正在解析为 <object> == <object> 而不是 <string> == <string> ,其结果相当于 Object.ReferenceEquals(a, b) 。若要获得值相等,应立即强制转换 a , b c 既然 是字符串,也可以使用 String.IsNullOrEmpty 而不是手动检查两者:

    for (int i = 0; i < Board.Length - 2; i++)
    {
        string a = (string)Board[i].Content;
        string b = (string)Board[i + 1].Content;
        string c = (string)Board[i + 2].Content;
        if (a == b && a == c && !String.IsNullOrEmpty(a))
        {
            MessageDialog msd = new MessageDialog("test");
            await msd.ShowAsync();
        }
    }