ตามเอกสารของ==
ผู้ประกอบการในMSDN ,
สำหรับประเภทค่าที่กำหนดไว้ล่วงหน้าตัวดำเนินการความเท่าเทียมกัน (==) จะส่งกลับค่าจริงถ้าค่าของตัวถูกดำเนินการเท่ากันเท็จมิฉะนั้น สำหรับชนิดการอ้างอิงอื่นที่ไม่ใช่สตริง == จะส่งกลับค่าจริงถ้าตัวถูกดำเนินการทั้งสองอ้างถึงวัตถุเดียวกัน สำหรับประเภทสตริง == เปรียบเทียบค่าของสตริง ประเภทค่าที่ผู้ใช้กำหนดสามารถโอเวอร์โหลดตัวดำเนินการ == (ดูโอเปอเรเตอร์) ดังนั้นประเภทการอ้างอิงที่ผู้ใช้กำหนดสามารถทำได้ โดยค่าเริ่มต้น == จะทำงานตามที่อธิบายไว้ข้างต้นสำหรับทั้งประเภทการอ้างอิงที่กำหนดไว้ล่วงหน้าและที่ผู้ใช้กำหนด
เหตุใดข้อมูลโค้ดนี้จึงไม่สามารถรวบรวมได้
bool Compare<T>(T x, T y) { return x == y; }
ฉันได้รับข้อผิดพลาดผู้ประกอบการ '==' ไม่สามารถนำไปใช้กับตัวถูกดำเนินการชนิด 'T' และ 'T' ฉันสงสัยว่าเพราะเท่าที่ฉันเข้าใจตัว==
ดำเนินการที่กำหนดไว้ล่วงหน้าสำหรับทุกประเภท?
แก้ไข:ขอบคุณทุกคน ตอนแรกฉันไม่ได้สังเกตว่าคำสั่งนั้นเกี่ยวกับประเภทการอ้างอิงเท่านั้น ฉันยังคิดว่าการเปรียบเทียบแบบทีละบิตมีไว้สำหรับค่าทุกประเภทซึ่งตอนนี้ฉันรู้ว่าไม่ถูกต้อง
แต่ในกรณีที่ฉันใช้ประเภทอ้างอิงตัว==
ดำเนินการจะใช้การเปรียบเทียบการอ้างอิงที่กำหนดไว้ล่วงหน้าหรือจะใช้ตัวดำเนินการรุ่นที่มีการโอเวอร์โหลดของผู้ประกอบการหรือไม่
แก้ไข 2:จากการทดลองและข้อผิดพลาดเราเรียนรู้ว่า==
ผู้ประกอบการจะใช้การเปรียบเทียบการอ้างอิงที่กำหนดไว้ล่วงหน้าเมื่อใช้ประเภททั่วไปที่ไม่ จำกัด ที่จริงแล้วคอมไพเลอร์จะใช้วิธีการที่ดีที่สุดที่จะหาอาร์กิวเมนต์ประเภทที่ จำกัด แต่จะไม่ดูเพิ่มเติม ตัวอย่างเช่นรหัสด้านล่างจะพิมพ์ทุกtrue
ครั้งแม้ว่าTest.test<B>(new B(), new B())
จะถูกเรียกว่า:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }
==
ไม่ได้รับอนุญาตระหว่างสองตัวถูกดำเนินการประเภทเดียวกัน สิ่งนี้เป็นจริงสำหรับstruct
ประเภท (ยกเว้นประเภท "ที่กำหนดไว้ล่วงหน้า") ซึ่งไม่ได้โหลดเกินoperator ==
จำนวน เป็นตัวอย่างง่ายๆลองนี้:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
แล้วคุณจะไม่สามารถตรวจสอบkvp1 == kvp2
เพราะKeyValuePair<,>
เป็น struct ก็ไม่ได้เป็น C # operator ==
ประเภทที่กำหนดไว้ล่วงหน้าและไม่เกิน ตัวอย่างvar li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
ที่คุณไม่สามารถทำได้e1 == e2
(ที่นี่เรามีโครงสร้างซ้อนกันList<>.Enumerator
(เรียก"List`1+Enumerator[T]"
โดยรันไทม์) ซึ่งไม่ได้โหลดเกิน==
)
bool
จากvoid
...