I know it is special case but why == between strings returns if their value equals and not when their reference equals. Does it have something to do with overlloading operat
Yes. From .NET Reflector here is the equality operator overloading of String class:
String
public static bool operator ==(string a, string b) { return Equals(a, b); }