पर जेनेरिक प्रकार पैरामीटर को बाधित करना संभव है: संक्षेप में: क्या सामान्य पैरामीटर को परिभाषित करना संभव है जहां टाइप पैरामीटर (T
) string
या int[]
पर बाध्य है? छद्म सी # में, मुझे क्या करना चाहते हैं:स्ट्रिंग या ऐरे
public static int MyMethod<T> (T arg1, T arg2)
where T : (has an indexer that returns an int) {
// stuff with arg1[i], arg2[j], etc...
}
ध्यान दें कि सी # में, की वजह से निर्मित string
इंडेक्सर int
, निम्नलिखित अभिव्यक्ति के char
से अंतर्निहित रूपांतरण के साथ (जो एक char
रिटर्न)
int someval = source[index];
धागा
Constrain generic extension method to base types and string मैं मैं सिर्फमें असंबद्ध प्रकार की एक सूची नहीं बना सकते एहसास प्रति
: इसका मतलब है ठीक है कि क्या source
एक ही बात एक string
या एक int[]
हैबाधा खंड। int[]
और string
दोनों T: IEnumerable<int>
का पालन करेंगे, लेकिन IEnumerable<T>
को कार्यान्वयनकर्ताओं को इंडेक्सर होने की आवश्यकता नहीं है, जो कि आम तौर पर एक सामान्य विशेषता है जिसे मैं दोनों प्रकार से उपयोग कर रहा हूं।
इसका उद्देश्य यह है कि मैं कुछ अत्यधिक अनुकूलित स्ट्रिंग पार्सिंग और डेमरो-लेवेनशेटिन दूरी एल्गोरिदम के तेज़ कार्यान्वयन जैसे कार्यों का विश्लेषण कर रहा हूं। मैंने पाया है कि पहले मेरे तारों को int के सरणी में परिवर्तित करने से कभी-कभी दोहराए जाने वाले चरित्र-दर-चरित्र प्रसंस्करण (डी-एल एल्गोरिदम के साथ) में तेजी से निष्पादन हो सकता है। यह काफी हद तक इस तथ्य के कारण है कि int
मानों की तुलना करना बहुत तेज है जो char
मानों की तुलना करता है।
ऑपरेटिव शब्द 'कभी-कभी' होता है। कभी-कभी तारों पर सीधे संचालन करना और पहले कनवर्टिंग की लागत से बचने और int
के सरणी में प्रतिलिपि बनाना बहुत तेज़ है। तो अब मेरे पास घोषणाएं हैं जो घोषणाओं को छोड़कर वास्तव में समान हैं।
बेशक मैं dynamic
का उपयोग कर सकता हूं, लेकिन रनटाइम जांच से प्रदर्शन दंड पूरी तरह से विधियों के निर्माण में किए गए किसी भी लाभ को नष्ट कर देता है। (मैं परीक्षण किया था)।
में 'टी' को स्थिर रूप से * या तो * एक प्रकार या किसी अन्य के रूप में इलाज करने के लिए यह समझदारी क्या है? बाधाओं का बिंदु आपको 'टी' प्रकार के चर पर काम करने की अनुमति देता है और न्यूनतम स्तर की संगतता की अपेक्षा करता है। दो परस्पर असंगत प्रकारों को रोकना विचित्र है। –
@ किर्क-वोल: जैसा कि मैंने विस्तार से वर्णन किया है, वे मेरे उद्देश्यों के लिए पारस्परिक रूप से असंगत नहीं हैं। इसके विपरीत, वे समान हैं। मैंने उन विधियों का उपयोग और निर्माण किया है जो 100% समान हैं, सिवाय इसके कि एक संस्करण में पैरामीटर को 'स्ट्रिंग' के रूप में घोषित किया गया है और दूसरे संस्करण में 'int [] 'के रूप में घोषित किया गया है। दोनों मामलों में मैं संग्रह के प्रत्येक सदस्य पर एक पूर्णांक के रूप में काम कर रहा हूं। –
नहीं। 'ऑब्जेक्ट' पर ''स्ट्रिंग' और (कोई भी) 'ऐरे' एकजुट हो जाता है, एक स्ट्रिंग * नहीं * एक' char [] 'सी # में है, हालांकि आप एक स्ट्रिंग से' char [] '* बना सकते हैं , लेकिन यह एक * नया * सरणी ऑब्जेक्ट है जिस पर कॉपी की गई सामग्री है। –