ผู้ประกอบการโดยนัยคงที่


คำตอบ:


263

นี้เป็นผู้ประกอบการแปลง หมายความว่าคุณสามารถเขียนรหัสนี้:

XmlBase myBase = new XmlBase();
XElement myElement = myBase;

และคอมไพเลอร์จะไม่บ่น! ที่รันไทม์ตัวดำเนินการแปลงจะถูกดำเนินการ - ส่งผ่านmyBaseเป็นอาร์กิวเมนต์และส่งคืนXElementผลลัพธ์ที่ถูกต้อง

นี่เป็นวิธีสำหรับคุณในฐานะนักพัฒนาซอฟต์แวร์ที่จะบอกคอมไพเลอร์:

“ ถึงแม้ว่าสิ่งเหล่านี้จะมีลักษณะที่ไม่เกี่ยวข้องกันสองแบบ แต่จริงๆแล้วมีวิธีการแปลงจากประเภทหนึ่งเป็นอีกประเภทหนึ่ง; ขอให้ฉันจัดการกับตรรกะเพื่อหาวิธีทำ”


11
+1 ฉันจะเพิ่มว่าแม้ว่าจะมีการแปลงโดยนัยที่ดีเป็นครั้งคราว แต่ก็สามารถทำให้เกิดข้อผิดพลาดที่แปลก / แปลกใจและสามารถสร้างความสับสนให้กับผู้ใช้ API (คน) ตัวอย่างเช่นมีการแปลงโดยนัยน้อยมากใน BCL ใช้ด้วยวิจารณญาณ!
Drew Noakes

13

โอเปอเรเตอร์ดังกล่าวหมายความว่าคุณสามารถแปลงXmlBaseเป็นXElementโดยปริยาย

XmlBase xmlBase = WhatEverGetTheXmlBase();
XElement xelement = xmlBase;   
//no explicit convert here like: XElement xelement = (XElement)xmlBase;

การแปลงที่ชัดเจนนี้สามารถทำงานได้หรือไม่ XElement xelement = (XElement)xmlBase;ในคำถามที่บอกstaticว่ามันจะต้องมีอะไรคงที่? มันไม่สามารถคงที่ได้หรือไม่ดังนั้นจึงสามารถสร้างอินสแตนซ์ได้?
บันดาลใจ

6

การใช้งานที่น่าสนใจอีกอย่างคือ (ซึ่ง Unity ทำการตรวจสอบว่าวัตถุ (และดังนั้นอินสแตนซ์ของ MonoBehavior) เป็นโมฆะ):

public static implicit operator bool (CustomClass c)
{
    return c != null;
}

โปรดทราบว่ารหัสจะต้องอยู่ในชั้นเรียน (CustomClass ในกรณีนี้) ด้วยวิธีนี้คุณสามารถทำสิ่งนี้:

void Method ()
{
    CustomClass c1 = null;
    CustomClass c2 = new CustomClass ();

    bool b1 = c1; // is false
    bool b2 = c2; // is true

    if (!c1 && c2)
    {
        // Do stuff
    }
}

เห็นได้ชัดว่าการใช้ที่มีชื่อเสียงที่สุดอาจใช้เพื่อแปลงชั้นเรียนของคุณเป็นชั้นเรียนอื่น แต่การใช้พวกมันกับประเภทพื้นฐานก็คุ้มค่าที่จะต้องพิจารณา ...


1
เคล็ดลับดี! สิ่งหนึ่งที่ควรทราบคือstatic implicit operator boolวิธีการที่จะต้องประกาศภายใน CustomClassฉันได้สร้างDotNetFiddle เพื่อใช้ในการสาธิต
แมตต์

1
@Matt - อ่าคำตอบของฉันอายุ 2 ปีแล้วในตอนนี้ ฉันอัปเดตโค้ดเล็กน้อยและเพิ่มคำใบ้ของคุณ
ต่อสู้

4

มันเป็นตัวดำเนินการแปลงโดยปริยาย (ตรงข้ามกับตัวดำเนินการอย่างชัดเจนซึ่งต้องการ(type)ไวยากรณ์การแปลง)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.