Can’t remember the details of how it works offhand, but I think for blueprints, those C++ methods are unknown and the comparisons will be done via the reflection system by default. Which would be per-property, hence the behaviour.
I think this can be overridden. Have a search in the engine codebase for CppStructOps. It’s a way of specifying custom C++ behaviour that the reflection system can access. I suspect there is one for equality testing.
Your == operator is just outsourcing the check to UItem’s == operator (that you might not have implemented).
It’s just better to give your UItem class a FGuid Id which you can compare within operators or simply compare UItems by FName there.
UItem is just a DataAsset, which means same pointer means same item.
Also thats not the problem. the == operator is never called as stated in my second post.
the solution from TheJamsh seems to be solving my issue though.