2011-04-15 10 views
25

मैं वैकल्पिक पैरामीटर के साथ खेल रहा था यह देखने के लिए कि वे इंटरफेस के साथ कैसे काम करेंगे और मैं एक अजीब चेतावनी में आया।वैकल्पिक पैरामीटर्स के साथ एक इंटरफ़ेस को स्पष्ट रूप से कार्यान्वित करने से चेतावनी

public interface ITestInterface 
{ 
    void TestOptional(int a = 5, int b = 10, object c = null); 
} 

public class TestClass : ITestInterface 
{ 

    void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null) 
    { 
     Console.Write("a=" + a + " b=" + b + " c=" + c); 
    } 
} 

संकलक मेरा पीछा चेतावनी देता है:: सेटअप मैं था निम्नलिखित कोड था

  • पैरामीटर के लिए निर्दिष्ट 'एक' कोई असर नहीं होगा, क्योंकि यह एक सदस्य पर लागू होता है कि डिफ़ॉल्ट मान उन संदर्भों में प्रयोग किया जाता है जो वैकल्पिक तर्कों की अनुमति नहीं देते हैं
  • पैरामीटर 'बी' के लिए निर्दिष्ट डिफ़ॉल्ट मान का कोई प्रभाव नहीं पड़ेगा क्योंकि यह ऐसे सदस्यों पर लागू होता है जो वैकल्पिक तर्कों की अनुमति नहीं देते हैं
  • डिफ़ॉल्ट मान निर्दिष्ट च

    class Program 
    { 
        static void Main(string[] args) 
        { 
         ITestInterface test = new TestClass(); 
         test.TestOptional(); 
         Console.ReadLine(); 
        } 
    } 
    

    मैं मिलता है: या पैरामीटर 'सी' कोई प्रभाव नहीं है क्योंकि यह एक सदस्य है कि संदर्भों में प्रयोग किया जाता है कि वैकल्पिक तर्क

अगर मैं निम्नलिखित कोड के साथ इस चलाने की अनुमति नहीं है पर लागू होता है होगा जैसा कि मैं उम्मीद करता हूं "" का आउटपुट।

मेरा प्रश्न यह है कि क्या चेतावनी है? इसका क्या संदर्भ है?

उत्तर

19

सी # में वैकल्पिक तर्कों के साथ समस्या यह है कि क्या कैली ऑब्जेक्ट को या ITestInterface के रूप में देखता है। पहले मामले में, कक्षा में घोषित मूल्य लागू होते हैं। दूसरे मामले में इंटरफेस में घोषित मूल्य लागू होते हैं। ऐसा इसलिए है क्योंकि संकलक कॉल बनाने के लिए स्थिर रूप से उपलब्ध प्रकार की जानकारी का उपयोग करता है। एक स्पष्ट इंटरफेस कार्यान्वयन विधि 'एक वर्ग के लिए' कभी नहीं कहा जाता है, के मामले में हमेशा 10.6.1 राज्यों में

सी # भाषा विशिष्टता 'एक अंतरफलक के लिए':

वैकल्पिक पैरामीटर एक में होते हैं आंशिक विधि घोषणा (§10.2.7) को कार्यान्वित करना, एक स्पष्ट इंटरफ़ेस सदस्य कार्यान्वयन (§13.4.1) या एकल-पैरामीटर इंडेक्सर घोषणा (§10.9) में संकलक को चेतावनी देना चाहिए, क्योंकि इन सदस्यों को कभी भी इसमें शामिल नहीं किया जा सकता है जिस तरह से तर्क छोड़ने के लिए अनुमति देता है।

+0

@ ग्रेगसी हाँ, स्पष्ट कार्यान्वयन के मामले में उनका कोई प्रभाव नहीं पड़ता है। एक अंतर्निहित कार्यान्वयन के मामले में महत्वपूर्ण बात यह है कि इंटरफेस और कक्षाओं में समान मूल्यों को बनाए रखना है। अन्यथा आप कुछ बहुत ही कठिन-से-खोज कीड़े के साथ समाप्त कर सकते हैं। –

+0

वे सी ++ में भी खोजना बहुत कठिन थे, इसलिए सी # टीम ने हाल ही में डिफ़ॉल्ट पैरामीटर मानों के साथ प्रतीक्षा करने का विकल्प चुना। मुझे लगता है कि मैंने इसे एरिक एल के ब्लॉग पर देखा, मुझे लगता है। – GregC

1

क्रेग,

इन चेतावनियों वर्ग विधि कार्यान्वयन में निर्दिष्ट मूलभूत मूल्यों से आ रहे हैं। .NET में, तर्क के लिए डिफ़ॉल्ट मान हमेशा संदर्भ प्रकार द्वारा निर्धारित किया जाता है। और निश्चित रूप से, इस तरह एक स्पष्ट इंटरफ़ेस कार्यान्वयन के साथ ही इस विधि को इंटरफ़ेस संदर्भ के माध्यम से कॉल करना संभव है - जो डिफ़ॉल्ट मान को परिभाषित करता है। इस तरह यह निश्चित रूप से अप्रासंगिक है कि आप कक्षा में क्या मूल्य डालते हैं, क्योंकि इसे कभी भी हल नहीं किया जाएगा और आप इसे खुशी से हटा सकते हैं। Intellisense ठीक हो जाएगा, यह देखते हुए कि यहां डिफ़ॉल्ट मूल्य कभी प्रभावी नहीं हो सकता है।

http://funcakes.posterous.com/?tag=c

http://funcakes.posterous.com/c-40-optional-parameters-default-values-and-i

+0

आपकी वाक्य "संदर्भ प्रकार" दूसरी वाक्य में थोड़ा अस्पष्ट है। यह समझाने में सहायक हो सकता है कि एक विधि परिभाषा जो एक इंटरफेस को लागू करता है प्रभावी रूप से दो प्रविष्टि बिंदुओं को परिभाषित करता है; डिफ़ॉल्ट मानकों को एक के लिए सम्मानित किया जाता है और दूसरे के लिए अनदेखा किया जाता है। एक स्पष्ट इंटरफ़ेस परिभाषा केवल एक प्रविष्टि बिंदु को परिभाषित करती है, और डिफ़ॉल्ट मानकों को वहां अनदेखा किया जाता है; यह किसी प्रविष्टि बिंदु को परिभाषित नहीं करता है जहां डिफ़ॉल्ट को सम्मानित किया जाएगा। – supercat

-1

संकलक आप

void ITestInterface.TestOptional(int a = 5, int b = 5, object c = null) 

कह रहा है, मौलिक

void ITestInterface.TestOptional(int a, int b, object c) 

कारण किया जा रहा है के रूप में ही है के बाद से आप के माध्यम से TestOptional आह्वान करने के लिए है अंतरफलक इंटरफ़ेस होगा पैरामीटर ऊपर। आपके लिए कक्षा में कोई तरीका नहीं है कि आपके पास पैरामीटर मान प्रदान नहीं किया गया हो।

+0

मैं शायद इन उत्तरों में से एक या अधिक डुप्लिकेट कर रहा हूं, लेकिन मैं वैसे भी इस प्रतिक्रिया को जोड़ने जा रहा हूं। उत्तर में से कोई भी वास्तव में स्पष्ट नहीं था कि वे क्या समझा रहे थे, मैंने इसे समझ लिया लेकिन मुझे लगता है कि ऊपर दिए गए कोड नमूने के साथ इसे बेहतर समझाया जा सकता है। –

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