स्थैतिक निहित संचालक


158

मुझे हाल ही में यह कोड मिला है:

 public static implicit operator XElement(XmlBase xmlBase)
 {
     return xmlBase.Xml;
 }

क्या static implicit operatorमतलब है?

जवाबों:


263

यह एक रूपांतरण ऑपरेटर है । इसका मतलब है कि आप इस कोड को लिख सकते हैं:

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

और कंपाइलर शिकायत नहीं करेगा! रनटाइम के दौरान, रूपांतरण ऑपरेटर को निष्पादित किया जाएगा - myBaseतर्क के रूप में पास करना , और XElementपरिणाम के रूप में एक वैध लौटना ।

संकलक को बताने के लिए डेवलपर के रूप में यह आपके लिए एक तरीका है:

"भले ही ये दो पूरी तरह से असंबंधित प्रकार के दिखते हैं, वास्तव में एक से दूसरे में बदलने का एक तरीका है; बस मुझे यह करने के लिए तर्क को संभालने की अनुमति दें।"


11
+1। मैं यह जोड़ना चाहता हूं कि जब कभी-कभी निहित रूपांतरण के अच्छे उपयोग होते हैं, तो यह भी अजीब / आश्चर्यजनक कीड़े पैदा कर सकता है, और एक (मानव) एपीआई उपयोगकर्ता को भ्रमित कर सकता है। उदाहरण के लिए, बीसीएल में निहित रूपांतरणों के बहुत कम उपयोग हैं। विवेक के साथ उपयोग करें!
ड्रू नोक

13

इस तरह के एक अंतर्निहित ऑपरेटर साधन आप परिवर्तित कर सकते हैं XmlBaseकरने के लिए XElementपरोक्ष।

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

क्या यह स्पष्ट रूप से रूपांतरण कार्य कर सकता है? XElement xelement = (XElement)xmlBase;प्रश्न में यह कहता है कि static, स्थैतिक होना क्या है? क्या यह गैर-स्थैतिक नहीं हो सकता है, इसलिए इसे तत्काल किया जा सकता है?
आकांक्षा

6

एक और दिलचस्प उपयोग यह है (जो एकता ने यह जांचने के लिए किया था कि कोई वस्तु (और इसलिए मोनोहेवियर का एक उदाहरण है) सुस्त है:

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 । मैंने डेमो उद्देश्य के लिए इसके लिए एक डॉटनेटफीड बनाया है ।
मैट

1
@ मत्त - आह, मेरा जवाब अब तक 2 साल का है। मैंने कोड को थोड़ा अद्यतन किया और आपका संकेत जोड़ा।
बैटल

4

यह एक अंतर्निहित रूपांतरण ऑपरेटर है (स्पष्ट ऑपरेटर के विपरीत, जिसके लिए (type)रूपांतरण सिंटैक्स की आवश्यकता होती है )

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.