คอมไพเลอร์ C # ต้องการว่าเมื่อใดก็ตามที่ประเภทที่กำหนดเองจะกำหนดผู้ประกอบการ==
มันจะต้องกำหนดด้วย!=
(ดูที่นี่ )
ทำไม?
ฉันอยากรู้ว่าทำไมนักออกแบบจึงคิดว่าจำเป็นและเหตุใดจึงไม่สามารถเริ่มต้นคอมไพเลอร์เพื่อให้เกิดการใช้งานที่สมเหตุสมผลสำหรับผู้ประกอบการรายใดรายหนึ่ง ตัวอย่างเช่น Lua ช่วยให้คุณกำหนดตัวดำเนินการความเสมอภาคเท่านั้นและคุณจะได้รับตัวดำเนินการอื่นฟรี C # จะทำเช่นเดียวกันโดยขอให้คุณสามารถกำหนดอย่างใดอย่างหนึ่งหรือทั้งสอง == == และ! = แล้วโดยอัตโนมัติรวบรวมหายไป! = !(left == right)
ผู้ประกอบการเป็น
ฉันเข้าใจว่ามีบางกรณีที่มุมแปลก ๆ ที่บางหน่วยงานอาจไม่เท่ากันหรือไม่เท่ากัน (เช่น IEEE-754 NaN) แต่สิ่งเหล่านั้นดูเหมือนเป็นข้อยกเว้นไม่ใช่กฎ ดังนั้นนี่ไม่ได้อธิบายว่าทำไมนักออกแบบคอมไพเลอร์ C # จึงได้ยกเว้นกฎ
ฉันเคยเห็นกรณีของฝีมือไม่ดีที่กำหนดตัวดำเนินการความเท่าเทียมกันจากนั้นผู้ดำเนินการความไม่เท่าเทียมกันจะเป็นสำเนาคัดลอกที่มีการเปรียบเทียบแต่ละรายการที่ย้อนกลับและทุก && เปลี่ยนเป็น | | (คุณได้รับจุด ... โดยทั่วไป! (a == b) ขยายผ่านกฎของ De Morgan) นั่นเป็นวิธีปฏิบัติที่ไม่ดีที่ผู้รวบรวมสามารถกำจัดได้โดยการออกแบบเช่นเดียวกับ Lua
หมายเหตุ: ตัวยึดเดิมสำหรับตัวดำเนินการ <> <=> = ฉันไม่สามารถจินตนาการถึงกรณีที่คุณจะต้องนิยามสิ่งเหล่านี้ด้วยวิธีที่ผิดธรรมชาติ Lua ช่วยให้คุณกำหนดได้เฉพาะ <และ <= และกำหนด> = และ> โดยธรรมชาติผ่านการปฏิเสธของ formers เหตุใด C # จึงไม่เหมือนกัน (อย่างน้อย 'โดยค่าเริ่มต้น')
แก้ไข
เห็นได้ชัดว่ามีเหตุผลที่ถูกต้องที่อนุญาตให้โปรแกรมเมอร์ดำเนินการตรวจสอบความเท่าเทียมกันและความไม่เท่าเทียมกันตามที่พวกเขาต้องการ คำตอบบางข้อชี้ไปที่กรณีที่อาจจะดี
เคอร์เนลของคำถามของฉัน แต่เป็นเพราะเหตุใดจึงเป็นสิ่งจำเป็นบังคับใช้ใน C # เมื่อมักจะไม่จำเป็นต้องมีเหตุผล ?
นอกจากนี้ยังเป็นในทางตรงกันข้ามที่โดดเด่นในการออกแบบทางเลือกสำหรับ NET อินเตอร์เฟซเหมือนObject.Equals
, IEquatable.Equals
IEqualityComparer.Equals
ที่ขาดการNotEquals
แสดงคู่ที่กรอบการพิจารณา!Equals()
เป็นวัตถุที่ไม่เท่ากันและที่ว่า นอกจากนี้คลาสที่ชอบDictionary
และวิธีการเช่น.Contains()
ขึ้นอยู่กับอินเทอร์เฟซดังกล่าวข้างต้นเท่านั้นและไม่ใช้ตัวดำเนินการโดยตรงแม้ว่าพวกเขาจะถูกกำหนดไว้ ในความเป็นจริงเมื่อ ReSharper สร้างความเท่าเทียมกันของสมาชิกจะกำหนดทั้งสอง==
และ!=
ในแง่ของEquals()
และได้แล้วเฉพาะในกรณีที่เลือกใช้ในการสร้างผู้ประกอบการที่ทุกคน ตัวดำเนินการความเสมอภาคไม่จำเป็นต้องใช้โดยกรอบเพื่อทำความเข้าใจความเท่าเทียมกันของวัตถุ
โดยพื้นฐานแล้ว. NET Framework ไม่สนใจตัวดำเนินการเหล่านี้ แต่จะสนใจเพียงไม่กี่Equals
วิธี การตัดสินใจที่จะกำหนดทั้งโอเปอเรเตอร์ == และ! = จะต้องถูกกำหนดโดยผู้ใช้นั้นมีความเกี่ยวข้องกับการออกแบบภาษาอย่างแท้จริง