ممنونم آقای عسگری؛ در تصریح گفته های شما و جهت ادامه بحث نکاتی را مطرح می کنم:
نکتۀ 1 : وقتی دو شی (یا بهتر بگم reference type) با هم مقایسه میشن ، در واقع مقایسه بین reference اون ها صورت می گیره. یعنی اگر هر دو به یک مکان در حافظه اشاره کنند ، اون وقت یکی هستن وگرنه خیر
در دات نت اشیائی که از نوع object هستند، در هنگام مقایسه، رفرنس آن ها با یکدیگر مقایسه می گردد که اینکار از طریق متد System.Object.ReferenceEquals(obj1,obj2) صورت می گیرد،
نکتۀ 3: دو نوع مقایسه داریم: structural و referential
یا به عبارتی Reference-Comparison و Value-Comparison،
در C#‎‎ برای هر دو نوع مقایسه می توان از اپراتور == استفاده نمود، پس این اپراتور بسته به اشیائی که با یکدیگر مقایسه می شوند یکی از دو مقایسه ذکر شده را انجام می دهد،

خوب در کدی که قرار داده شد، در حقیقت این دو مقایسه در حال ترکیب شدن با هم هستند و اگر دقت کنید در خطوط 11 و 13 که یک شیء از نوع object در حال مقایسه با شیء دیگری از نوع string است با Warning زیر روبرو می شوید:

Possible unintended reference comparison; to get a value comparison, cast the left hand side to type 'string'.

پس دقت کنید که اپراتور == می تواند عملکردی متفاوت با آنچه در ذهن شماست داشته باشد،

حالا به یک قضیه ی مهم میرسیم،
به نظر شما چرا مقایسه های اول و سوم مثل یکدیگر عمل نمی کنند؟

،/