इस कोड संकलन नहीं होगा:अस्पष्ट विस्तार विधि कॉल
using System;
using System.Runtime.CompilerServices;
static class Extensions {
public static void Foo(this A a, Exception e = null, string memberName = "") {
}
public static void Foo<T>(this A a, T t, Exception e = null, string memberName = "")
where T : class, IB {
}
}
interface IB { }
class A { }
class Program {
public static void Main() {
var a = new A();
var e = new Exception();
a.Foo(e); //<- Compile error "ambiguous call"
}
}
लेकिन अगर मैं पिछले string
तर्क को नष्ट सब कुछ ठीक है:
public static void Foo(this A a, Exception e = null) {
}
public static void Foo<T>(this A a, T t, Exception e = null)
where T : class, IB {
}
प्रश्न है - कि ये वैकल्पिक क्यों string
तर्कों को तोड़ने संकलक की पसंद विधि कॉल का?
जोड़ा गया: स्पष्ट प्रश्न: मैं क्यों संकलक पहले मामले में सही अधिभार नहीं चुन सकते हैं मिलता है न, लेकिन दूसरा एक में यह कर सकता है?
संपादित: [CallerMemberName]
विशेषता यहाँ तो मैं सवाल से उसे हटा दिया है एक समस्या का एक कारण नहीं है।
बस स्पष्ट करने के लिए: निकाला जा रहा है '[CallerMemberName]' अकेले विशेषता * कोई * प्रभाव पड़ता है, संकलक एक त्रुटि आउटपुट। पूरे तर्क को हटाकर '[कॉलरमेनम्बर] स्ट्रिंग सदस्यनाम =" "* * * एक प्रभाव है, कोड संकलित करता है। मैं यही देखता हूं। सही? –
** सी # विशिष्टता: 7.5.3.2 बेहतर कार्य सदस्य: ** * अन्यथा यदि एमपी के सभी मानकों में एक समान तर्क है जबकि एमक्यू में कम से कम एक वैकल्पिक पैरामीटर के लिए डिफ़ॉल्ट तर्कों को प्रतिस्थापित करने की आवश्यकता है तो एमपी एमक्यू से बेहतर है। * वह नियम दूसरे मामले में लागू होता है, लेकिन पहले मामले में लागू नहीं किया जा सकता है। – PetSerAl
यदि आप केवल '[कॉलरमेम्बरनाम]' विशेषता को हटाते हैं, लेकिन पैरामीटर 'स्ट्रिंग सदस्यनाम = "" 'दोनों विधियों में रखें, तो क्या होता है? संपादित करें: @OndrejTucny पहले से ही कहा है कि, मैं पोस्ट करने के बाद देखते हैं। अभी भी एक अच्छा सवाल है। –