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
является ссылочным типом.