2009-04-17 10 views
23

क्यों मैं इस तरह के निहित और स्पष्ट ऑपरेटरों को परिभाषित नहीं कर सकता?मैं निहित और स्पष्ट ऑपरेटरों दोनों को परिभाषित क्यों नहीं कर सकता?

public class C 
    { 
     public static implicit operator string(C c) 
     { 
      return "implicit"; 
     } 

     public static explicit operator string(C c) 
     { 
      return "explicit"; 
     } 
    } 

आप इस हैक हालांकि :)

class Program 
    { 
     public class A 
     { 

     } 

     public class B 
     { 
      public static implicit operator A(B b) 
      { 
       Console.WriteLine("implicit"); 
       return new A(); 
      } 
     } 

     public class C : B 
     { 
      public static explicit operator A(C c) 
      { 
       Console.WriteLine("explicit"); 
       return new A(); 
      } 
     } 

     static void Main(string[] args) 
     { 
      C c = new C(); 

      A a = c; 
      A b = (A) c; 
     } 
    } 

यह प्रिंट कर सकते हैं:

implicit 
explicit 
+0

कौन कहता है कि आप नहीं कर सकते? यानी, जब आप कोशिश करते हैं तो क्या होता है? –

+0

आप दोनों के बीच अलग-अलग कार्यान्वयन क्यों चाहते हैं? –

+1

ओवरराइड टूस्ट्रिंग एक निहित कास्ट ऑपरेटर तक भी बंद नहीं है। आपका उदाहरण कोड केवल काम करता है क्योंकि कंसोल। राइटलाइन के पास ऑब्जेक्ट ओवरलोड है और ऑब्जेक्ट पर ToString() को कॉल करता है। – Samuel

उत्तर

5

मैं तकनीकी सीमा यह है कि इस से बचाता है पता नहीं है, लेकिन मुझे लगता है वे के लिए होता है लोगों को अपने पैरों को बंद करने से रोकने के लिए ऐसा किया।

string imp = new C(); // = "implicit" 
string exp = (string)new C(); // = "explicit" 

जो मुझे bonkers ड्राइव और कोई मतलब नहीं है होता है, C केवल एक स्ट्रिंग 1 जिस तरह से करने के लिए, नहीं 2 अलग अलग तरीकों से डाली चाहिए।

+0

आप इसे दो तरह से कर सकते हैं, आप बस दोनों के लिए कस्टम रूपांतरण नहीं कर सकते हैं। – Prankster

+1

नहीं, आप इसे नहीं कर सकते हैं, ToString एक कास्ट ऑपरेटर नहीं है। – Samuel

+0

"उदाहरण" अपडेट किया गया – Prankster

35

चेक करें: Why can't coexist implicit and explicit operator of the same type in C#?

आप एक स्पष्ट ऑपरेटर को परिभाषित, तो आप इस तरह कुछ करने के लिए सक्षम हो जाएगा:

Thing thing = (Thing)"value"; 

आप एक अंतर्निहित ऑपरेटर को परिभाषित हैं, तो आप इसके बाद के संस्करण अभी भी कर सकते हैं, लेकिन आप यह भी निहित रूपांतरण का लाभ ले सकते:

Thing thing = "value"; 

संक्षेप में, स्पष्ट केवल स्पष्ट रूपांतरण की अनुमति देता है, निहित दोनों स्पष्ट और implici की अनुमति देता है, जबकि टी ... इसलिए कारण है कि आप केवल एक को परिभाषित कर सकते हैं।

संबंधित मुद्दे