Windows Phone 8.1 сравнивает Control.Content, дающий неверный результат

У меня действительно странная проблема. У меня есть следующий фрагмент кода:

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 ответ

Решение

Вы выполняете сравнение равенства ссылок вместо сравнения равенства значений. Ваш код соответствует следующему:

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, Теперь, когда a это строка, вы также можете использовать 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();
    }
}
Другие вопросы по тегам