ऐसा लगता है कि उत्तर "नहीं" है। की तरह आप के लिए, आप निर्दिष्ट करने की आवश्यकता होगी चाहते हैं, तो आप एक अधूरे निर्मित सामान्य समारोह गुजर सकता है तो परिकल्पित
int i = Transform<int>("");
,:
जब आप Transform
सीधे कॉल, आप एक प्रकार पैरामीटर निर्दिष्ट करना साथ ही मानकों टाइप करें:
void GeneralizedFunction(string aStringA, string aStringB, Func<string, T> aAction)
{
A result1 = aAction<A>(aStringA);
B result2 = aAction<B>(aStringB);
// Do something with A and B here
}
तो मुझे लगता है कि आप परिकल्पित ऐसा कर सकता है, अगर सी # ऐसे ही एक वाक्य रचना की थी।
लेकिन उपयोग का मामला क्या है? तारों को मनमाना प्रकार के डिफ़ॉल्ट मान में बदलने के अलावा, मुझे इसके लिए अधिक उपयोग नहीं दिख रहा है। आप एक ऐसे फ़ंक्शन को कैसे परिभाषित कर सकते हैं जो बयान की एक ही श्रृंखला का उपयोग करके दो अलग-अलग प्रकारों में से एक अर्थपूर्ण परिणाम प्रदान करेगा?
संपादित
कारण है कि यह संभव नहीं है के विश्लेषण:
आप अपने कोड में एक लैम्ब्डा अभिव्यक्ति का उपयोग करते हैं, यह या तो एक प्रतिनिधि या एक अभिव्यक्ति पेड़ में संकलित किया गया है; इस मामले में, यह एक प्रतिनिधि है। आपके पास "खुले" जेनेरिक प्रकार का उदाहरण नहीं हो सकता है; दूसरे शब्दों में, एक सामान्य प्रकार से ऑब्जेक्ट बनाने के लिए, सभी प्रकार पैरामीटर निर्दिष्ट किए जाने चाहिए।दूसरे शब्दों में, इसके सभी प्रकार के पैरामीटर के लिए तर्क प्रदान किये बिना किसी प्रतिनिधि का उदाहरण रखने का कोई तरीका नहीं है।
सी # कंपाइलर की सहायक सुविधाओं में से एक अंतर्निहित विधि समूह रूपांतरण है, जहां एक विधि का नाम (एक "विधि समूह") को उस विधि के अधिभारों में से एक का प्रतिनिधित्व करने वाले प्रतिनिधि प्रकार में निहित रूप से परिवर्तित किया जा सकता है। इसी तरह, संकलक एक लैम्ब्डा अभिव्यक्ति को एक प्रतिनिधि प्रकार में निहित रूप से परिवर्तित करता है। दोनों मामलों में, संकलक प्रतिनिधि प्रकार का उदाहरण बनाने के लिए कोड उत्सर्जित करता है (इस मामले में, इसे फ़ंक्शन में पास करने के लिए)। लेकिन उस प्रतिनिधि प्रकार के उदाहरण को अभी भी इसके प्रत्येक प्रकार के पैरामीटर के लिए एक प्रकार का तर्क होना चाहिए।
एक सामान्य समारोह के रूप में सामान्य समारोह पास करने के लिए, ऐसा लगता है, संकलक रूपांतरण बिना विधि को विधि समूह या लैम्ब्डा अभिव्यक्ति पारित करने में सक्षम होने की जरूरत है, इसलिए aAction
पैरामीटर किसी भी प्रकार का "विधि समूह" या "लैम्ब्डा अभिव्यक्ति" होगा। फिर, एक प्रतिनिधि प्रकार के लिए निहित रूपांतरण कॉल साइट A result1 = aAction<A>(aStringA);
और B result2 = aAction<B>(aStringB);
पर हो सकता है। बेशक, इस बिंदु पर, हम contrafactuals और hypotheticals के ब्रह्मांड में अच्छी तरह से हैं।
समाधान मैं के साथ खत्म हो गया दोपहर के भोजन के इस था, एक समारोह Deserialize<T>
कि एक स्ट्रिंग धारावाहिक डेटा वाली लेता है और प्रकार T
की एक वस्तु देता है यह सोचते हैं आया:
void GeneralizedFunction<T>(string aStringA, string aStringB, Func<T, string> stringGetter)
{
A result1 = Deserialize<A>(stringGetter(aStringA));
B result2 = Deserialize<B>(stringGetter(aStringB));
}
void Example(string serializedA, string serializedB, string pathToA, string pathToB, FileInfo a, FileInfo b)
{
GeneralizedFunction(serializedA, serializedB, s => s);
GeneralizedFunction(pathToA, pathToB, File.ReadAllText);
GeneralizedFunction(a, b, fi => File.ReadAllText(fi.FullName));
}
यह क्या है: अपने विशिष्ट उपयोग के लिए
, यह करने के लिए सरल किया जा सकता आप बिल्कुल करना चाहते हैं? चूंकि आप ट्रांसफॉर्म फ़ंक्शन के संबंध में सामान्यीकृत फ़ंक्शन को किसी भी प्रकार की जानकारी देना नहीं चाहते हैं, फिर एक स्ट्रिंग लेने और किसी ऑब्जेक्ट को वापस करने के लिए फ़ंक्शन को स्वीकार क्यों न करें (जिसमें से सभी जानते हैं कि हर कोई *) – Polity
बात यह है कि, "कुछ करें ए और बी "प्लेसहोल्डर समस्याग्रस्त हिस्सा छुपाता है। क्या ए और बी हमेशा विशेष प्रकार के होने जा रहे हैं? तब आपको जेनेरिक की आवश्यकता नहीं है। क्या वे मनमाने ढंग से (शायद बाधाओं के साथ) प्रकार हैं? फिर 'सामान्यीकृत समारोह' में सामान्य होना आवश्यक है। – AakashM
ए और बी ठोस प्रकार हैं, लेकिन ट्रांसफॉर्म एक सामान्य कार्य है। – Max