Попытка проверить Button.Content.Inputs false, когда true (Tic-tac-toe простая игра) - PullRequest
0 голосов
/ 05 мая 2019

Я создаю простую игру в крестики-нолики, все работает правильно, пока не проверю содержимое кнопок, и я застрял с проблемой:

она всегда возвращает false, даже если кнопки имеют правильное содержимое.

Я пытался изменить строку как (Content, так и 'x' или '0') - кнопка не работает. Содержимое должно быть объектом

if ((buttons[0].Content == (object)'x' || buttons[0].Content==(object)'0') &&(buttons[3].Content == (object)'x' || buttons[3].Content == (object)'0')
               && (buttons[6].Content == (object)'x' || buttons[6].Content == (object)'0'))
            {
                MessageBox.Show("You have won", "Tic-tac-toe");
                this.Close();
            }

Я ожидаю проверки с истинным выводом, поэтомуигра закончится.

1 Ответ

0 голосов
/ 05 мая 2019

System.Char является ValueType. Таким образом, когда вы приводите ее к System.Object, CLR создает копию этого объекта и сохраняет ее в управляемой куче. Этот метод называется боксом. (Подробнее на MSDN: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing).

Итак, у вас есть два разных экземпляра System.Object: первый хранится в свойстве Button.Content, а второй был получен путем приведения. Затем вы применяете оператор == к этим экземплярам. Когда это происходит, CLR пытается сравнить ссылки операндов. Но, как я уже сказал, у вас есть два разных объекта, поэтому, как и ожидалось, его ссылки не равны. Вот почему вы получили false в результате.

Чтобы решить вашу проблему, я предлагаю вам попробовать Button.Content на System.Char, а не наоборот. Или используйте System.String вместо System.Char в качестве содержимого ваших кнопок. Потому что System.String является ссылочным типом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...