this question के समान, मैं वैकल्पिक पैरामीटर को पैराम कीवर्ड के साथ मिश्रित करना चाहता हूं, जो निश्चित रूप से अस्पष्टता पैदा करता है। दुर्भाग्य से, बनाने भार के का जवाब काम नहीं करता है, जैसा कि मैंने फोन करने वाले की जानकारी का लाभ लेने के लिए जिम्मेदार बताते हैं, इस तरह हैं:वैकल्पिक पैरामीटर और पैराम्स को मिलाकर
public void Info(string message, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0, params object[] args)
{
_log.Info(BuildMessage(message, memberName, lineNumber), args);
}
वैकल्पिक पैरामीटर के बिना एक अधिभार बनाना कॉल-साइट बदल जाएगा, इन विशेष मानकों को रोकने ठीक से काम करने से।
मैं एक समाधान है कि लगभग काम करता है (हालांकि यह बदसूरत है) पाया:
public void Info(string message, object arg0, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0);
}
public void Info(string message, object arg0, object arg1, [CallerMemberName] string memberName = "",
[CallerLineNumber] int lineNumber = 0)
{
_log.Info(BuildMessage(message, memberName, lineNumber), arg0, arg1);
}
समस्या यहाँ अगर आप अंतिम तर्क के लिए एक स्ट्रिंग निर्दिष्ट, अधिभार संकल्प मानता है कि आप स्पष्ट रूप से निर्दिष्ट करने का इरादा कर रहे हैं memberName
अधिभार में जो कम तर्क लेता है, जो वांछित व्यवहार नहीं है।
क्या इसे पूरा करने का कोई तरीका है (शायद कुछ नए विशेषताओं का उपयोग करके मैंने नहीं सीखा है?) या क्या हम ऑटो-जादुई कंपाइलर समर्थन हमें क्या दे सकते हैं इसकी सीमा तक पहुंच गए हैं?
हम ठीक उसी कारणों से इस काम करने की कोशिश की और विफल रहे। – CSharpie
ध्यान में रखते हुए कि यह 'कॉलरइन्फो' के लिए मुख्य उपयोग-मामला है, यह विशेषता समाधान केवल भयानक है। – nicodemus13
आपको केवल एक अतिरिक्त प्रकार (और कुछ सामान्य तरीकों) की आवश्यकता है। मैंने इस समस्या का एक आशाजनक संतोषजनक उत्तर प्रदान किया है। –