2012-05-25 15 views
5

साथ मैं विस्तार तरीकों, जो एक ही नाम स्थान और विधानसभा में हैं निम्नलिखित जोड़ी:विधि संकल्प वैकल्पिक पैरामीटर

public static class DateTimeExtensions 
{ 
    public static string NullSafeToString(this DateTime? possiblyNullDateTime, string format, string nullString = "") 
} 

public static class NullableExtensions 
{ 
    public static string NullSafeToString<T>(this Nullable<T> nullable, string nullString = "") where T : struct 
} 

मेरा प्रश्न विधि संकल्प के बारे में है। निम्नलिखित कॉल (एक और नाम स्थान से) ObjectExtensions.NullSafeToString पर ले कर जब मैं उम्मीद DateTimeExtensions.NullSafeToString:

DateTime? dateTime; 
// ... 
dateTime.NullSafeToString("yyyyMMdd"); 

की उम्मीद के रूप में यह हल करने का कारण बनता है DateTimeExtensions.NullSafeToString से वैकल्पिक पैरामीटर निकाला जा रहा है।

सी # spec की धारा 7.6.5.2 खोजे गए नामस्थानों के क्रम की रूपरेखा बताती है, लेकिन उपर्युक्त समान नामस्थान में हैं, इसलिए मैं धारा 7.6.5.1 में नियमों का उपयोग करने की अपेक्षा करता हूं।

मैंने सोचा था कि क्योंकि यह DateTimeExtensions.NullSafeToString से मेल चाहते हैं:

  • हालांकि वे दोनों Nullable<DateTime> की पहली पैरामीटर प्रकार होगा, मैंने सोचा था कि एक गैर सामान्य विधि (यानी प्रकार पैरामीटर के बिना) पहले विचार किया जाएगा ।
  • मैं हालांकि पैरामीटर सूचियों पहली बार अपने वैकल्पिक पैरामीटर के बिना विचार किया जाएगा

किसी को भी स्पष्ट कर सकते हैं कि ऐसा क्यों DateTimeExtensions.NullSafeToString से अधिक ObjectExtensions.NullSafeToString उठा रहा है?

(इसके अलावा: यहां पर अन्य चर्चाओं से, मुझे संदेह है कि कुछ लोग डिफ्रेंसिंग नल-सुरक्षित बनाने के लिए विस्तार विधि अर्थशास्त्र का उपयोग करने से इनकार कर सकते हैं, लेकिन मुझे लगता है कि इस तरह के सीमित परिदृश्यों के लिए उपयोग किया जाता है, वे अधिक पठनीय कोड के लिए भी बनाते हैं। मैं जानता हूँ कि Nullable.ToString पहले से ही अशक्त-सुरक्षित है क्योंकि Nullable वस्तु ही अशक्त नहीं है, लेकिन है कि निहित ToString के मानकों को पूरा नहीं करता है, और मुझे लगता है कि कोई स्पष्ट नाम विधि अशक्त-सुरक्षित आशय इंगित करता है।)

+2

अधिभार संकल्प लागू होता है की कोशिश कर सकते हैं। –

उत्तर

1

आपकी समस्या के पास विस्तार विधि से कोई लेना देना नहीं है। यह अधिभार संकल्प और वैकल्पिक पैरामीटर के बारे में है। (ग # कल्पना की 7.5.3 अधिभार संकल्प) आप "== बेहतर कम तर्क" इस कोड

public static string NullSafeToString(DateTime? possiblyNullDateTime, string format, string nullString = "") 
    { 
     return string.Empty; 
    } 
    public static string NullSafeToString<T>(Nullable<T> nullable, string nullString = "") where T : struct 
    { 
     return string.Empty; 
    } 
    static void Test() 
    { 
     DateTime? datetime = DateTime.Now; 
     NullSafeToString(datetime, "yyyyMMdd"); 
    } 
+0

आपके उत्तर के लिए धन्यवाद। मैं अभी भी स्पष्ट नहीं हूं कि यह DateTxtensions.NullSafeToString को DateTimeExtensions.NullSafeToString पर क्यों चुन रहा है। 7.5.3.1: "यदि एमपी एक गैर-सामान्य विधि है और एमक्यू एक सामान्य विधि है, तो एमपी एमक्यू से बेहतर है"। मुझे लगता है कि कुछ अन्य नियम पहले खेल में आ रहा है, लेकिन मुझे यकीन नहीं है कि कौन सा है। – Giles

+0

क्षमा करें - यह 7.5.3.2 होना चाहिए "बेहतर कार्य सदस्य"। – Giles

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