I\'m working on a C# project on which, until now, I\'ve used immutable objects and factories to ensure that objects of type Foo can always be compared for equal
Foo
It definitely smells. When overloading == you should make sure that both Equals() and GetHashCode() are also consistent. See the MSDN guidelines.
==
Equals()
GetHashCode()
And the only reason that this seems OK at all is that you describe your type as immutable.