Я не владею WPF, но в контексте Winforms я бы сказал, что Tag имеет тип Object.
Оператор равенства на объекте сравнивает ссылки.
Если вы (или какой-либо другой читатель) захотите узнать, почему это все еще работает в некоторых случаях:
Когда вы строите строки с помощью StringBuilder или неуправляемых функций, вы не получаете внутреннюю строку так называемого. Это означает, что есть способ, которым у вас есть два различных строковых объекта во время выполнения, которые имеют одинаковое содержимое.
Обычно строки ссылаются на один и тот же экземпляр, за исключением случаев, когда они создаются во время выполнения, как описано выше.
Вы можете вызвать String.Intern, чтобы получить внутреннюю ссылку на строку с тем же содержимым. Это обязательно один и тот же экземпляр для одного и того же контента. Бывают ситуации, когда знание этой крошечной детали может быть большим подспорьем или откровением.