यहां मैं यह करना चाहता हूं:मैं अपने वांछित सी # polymorphism के साथ क्यों कॉम्पैक्ट नहीं कर सकता?
XmlWriter writer = XmlWriter.Create(
(string.IsNullOrEmpty(outfile) ? Console.Out : outfile)
);
यह संकलित नहीं करता है, हालांकि, त्रुटि दे रहा है "सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है क्योंकि 'System.IO.TextWriter' और 'स्ट्रिंग' के बीच कोई अंतर्निहित रूपांतरण नहीं है ' "। उपरोक्त कोड निम्न का सरलीकरण है:
XmlWriter writer;
if (string.IsNullOrEmpty(outfile))
{
writer = XmlWriter.Create(Console.Out); // Constructor takes TextWriter
}
else
{
writer = XmlWriter.Create(outfile); // Constructor takes string
}
Create
पर ये दो कॉल पूरी तरह मान्य हैं, और यह संकलित करता है। क्या यह और अधिक कॉम्पैक्ट बनाने का कोई तरीका है, जैसे कि मैं अपने इनलाइन परीक्षण के साथ करने की कोशिश कर रहा था?
यह मुझे समझ में नहीं आता है कि जो मैं चाहता हूं वह काम नहीं करता है। मानसिक रूप से इस बारे में सोचते हुए, ऐसा लगता है कि संकलक string.IsNullOrEmpty(outfile)
का मूल्यांकन करेगा कि यह निर्धारित करने के लिए कि कौन सा मामला लेना है:
- अगर स्थिति सत्य थी, तो यह
Console.Out
के साथ जाएगी, और फिर देखें कि इसे polymorphically संस्करण का चयन करना हैXmlWriter.Create
जो टेक्स्टवाइटर लेता है। - अगर स्थिति गलत थी, तो यह
outfile
के साथ जाएगी, और फिर देखें कि इसेXmlWriter.Create
के संस्करण को polymorphically चुनने की आवश्यकता है जो एक स्ट्रिंग लेता है।
क्या एमएल में प्रोग्रामिंग ने मेरे दिमाग को तोड़ दिया है?
कंपाइलर संकलन समय पर कक्षा/विधि का नाम और तर्क चुनता है, लेकिन polymorphically रनटाइम पर कॉलवर्ट आईएल निर्देश के माध्यम से उस विधि के कार्यान्वयन को चुनता है। –