2010-01-11 17 views
17

मैं कम से कम मेरे लिए एक कुरकुरा कुश्ती कर रहा हूं, विधि के ओवरलोडिंग रिज़ॉल्यूशन विधि।विधि अधिभार रिज़ॉल्यूशन अप्रत्याशित व्यवहार

class Program 
{ 
    static void Main(string[] args) 
    { 
     var test = new OverloadTest(); 
     test.Execute(0); 
     test.Execute(1); 

     Console.ReadLine(); 
    } 
} 

public class OverloadTest 
{ 
    public void Execute(object value) 
    { 
     Console.WriteLine("object overload: {0}", value); 
    } 

    public void Execute(MyEnum value) 
    { 
     Console.WriteLine("enum overload: {0}", value); 
    } 
} 

public enum MyEnum 
{ 
    First = 1, Second = 2, Third = 3 
} 

प्रिंट होगा:: मैं समस्या को ठीक करने के लिए एक छोटा सा नमूना लिखा है

enum overload: 0 
object overload: 1 

मूल रूप से अधिभार कहा जाता है मूल्य के आधार पर अलग है (0, 1) दिए गए डेटा प्रकार के बजाय ।

क्या कोई समझा सकता है?

अद्यतन

मैं वहाँ सी # 2 और सी # 3

Do((long)0) => object overload //C# 2 
Do((long)0) => enum overload //C# 3 

उत्तर

16

हाँ - निरंतर 0 परोक्ष किसी भी enum प्रकार के लिए परिवर्तनीय है। स्थिर 1 केवल स्पष्ट रूप से enum प्रकार में परिवर्तनीय है। दोनों निहित रूप से object (मुक्केबाजी के माध्यम से) में परिवर्तनीय हैं लेकिन enum में रूपांतरण को प्राथमिकता दी जाती है जहां यह उपलब्ध है।

ध्यान दें कि कुछ भी है जो enum परिभाषित करता है के साथ करने के लिए। किसी भी गैर-शून्य मान के लिए रूपांतरण स्पष्ट है कि यह enum में किसी मान से मेल खाता है या नहीं। यह मान 0 के लिए सिर्फ एक विशेष मामला है, जो कुछ अन्य कोड को सरल बनाता है (विशेष रूप से झंडे से निपटने पर)। मेरे पास संदर्भ खोजने के लिए हाथ नहीं है, मुझे डर है।

बोनस अजीबता: एमएस कंपाइलर में एक बग के कारण (कभी तय नहीं किया जाएगा - यह पिछड़ा संगतता तोड़ देगा) यह वास्तव में various zero constants है, न केवल एक पूर्णांक। तो Execute(0d) और Execute(0m) भी एक डबल और दशमलव को enum में परिवर्तित कर देगा। यह प्रत्येक शून्य स्थिरता के लिए काम नहीं करता है - यह स्रोत कोड की सटीक प्रकृति पर निर्भर करता है। यह सब बहुत अजीब है - लिंक का पालन करें जहां एरिक लिपर्ट सभी का खुलासा करता है ...

+0

यह बहुत अजीब है। मैं उम्मीद करता था कि यह बिल्कुल संकलित न हो, क्योंकि निष्पादन के लिए दो अलग-अलग कॉल संदिग्ध हैं। 0 और 1 int हैं, और इसलिए यह वस्तु अधिभार के साथ-साथ MyEnum अधिभार को कॉल करने के लिए समान रूप से मान्य है। – Nick

+0

मुझे यह नहीं पता था। किसी भी enum प्रकार के लिए 0 स्पष्ट रूप से परिवर्तनीय क्यों है? उदाहरण में, 0 मान्य मान नहीं है। अगर कुछ मेरी सोच की रेखा को समझ में नहीं आता है, तो इसका मतलब यह नहीं है कि (1 मिनट पहले संकेत दिया गया है);) – hackerhasid

+0

@statichippo: यह कुछ मामलों में आसान है, जैसे कि बिटवाइज अंकगणित करने के बाद झंडे। @ निक: दोनों विधियां * लागू * हैं, लेकिन 0 से enum का रूपांतरण सी # spec के नियमों द्वारा ऑब्जेक्ट से ऑब्जेक्ट से "बेहतर" है ... यही कारण है कि अधिभार कहा जाता है। –

-1

एक Enum के बीच एक अलग व्यवहार सिर्फ एक पूर्णांक (डिफ़ॉल्ट रूप से) के लिए मैप किया गया है कि कहा जाना चाहिए था। 0 आपके एनम पर मैप नहीं करता है इसलिए ऑब्जेक्ट लेने वाले अधिभार का उपयोग किया जाता है। आपके enum के लिए 1 नक्शे तो Enum अधिभार का उपयोग किया जाता है।

आप ऐसा कर सकता है:

Execute((object) 1); 

वस्तु अधिभार उत्पादन के लिए

: 1

+2

ऐसा लगता है कि परिणाम वास्तव में आपकी आशा के विपरीत है। Enum अधिभार 0 के लिए हिट हो रहा है और नहीं 1. – mkedobbs

+0

मैं बस इस पर चला गया और महसूस किया कि मैंने पोस्ट को गलत तरीके से पढ़ा था। मैंने सोचा कि 0 "वस्तु" कह रहा था और 1 "enum" को बुला रहा था। मुझे इसमें देखना होगा क्योंकि _that_ ज्यादा समझ में नहीं आता है! – hackerhasid

+0

@statichippo: जब आप spec को देखते हैं और कौन से रूपांतरण उपलब्ध होते हैं तो यह सही समझ में आता है :) –

0

मैं जॉन स्कीट के उत्तर से सहमत हूं - 11 जनवरी को 17:32 को अपनी पोस्ट (उपरोक्त) देखें। आगे का विस्तार करने के लिए, करने के लिए सी # भाषा विनिर्देश देखें - पेज: 110

6.1.3 अंतर्निहित गणना रूपांतरण एक अंतर्निहित गणना रूपांतरण दशमलव-पूर्णांक शाब्दिक 0 परमिट किसी भी enum प्रकार में बदला जाने वाला और किसी भी नामुमकिन प्रकार के जिसके अंतर्निहित प्रकार एक enum-type है। बाद के मामले में रूपांतरण का मूल्यांकन अंतर्निहित enum-type में परिवर्तित करके और परिणाम लपेटकर (§4.1.10) किया जाता है।

बयान जोड़ने:

फिर भी वहाँ एक समस्या है

test.Execute (-0.0); // वस्तु अधिभार: 0

निम्नलिखित को जोड़ते समय:

test.Execute (0.0); // enum अधिभार: 0

जैक्स Colmenero एन्टरप्राइज़ आर्किटेक्ट [email protected]

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