Operators apply through static analysis (and overloads), not virtual methods (overrides). With the cast, it is doing a reference equality check. Without the cast, it can run the TwoDPoint
operator. I guess this is to avoid problems when an operator is added.
Personally, though, I'd do a reference check explicitly with ReferenceEquals
.