2013-06-12 7 views
6

क्षमा करें अगर मैं मूर्ख सवाल पूछ रहा हूं, लेकिन क्या कोई निम्नलिखित दो कॉल (ToArray) के बीच अंतर को समझा सकता है। इंटेलिजेंस में यह उन्हें ओवरलोडेड विधियों के रूप में नहीं दिखाता है & बेशक दोनों कॉल का आउटपुट समान है।ToArray() और ToArray <int>() के बीच अंतर;

List<int> i = new List<int> { 1, 2, 5, 64 }; 
int[] input = i.Where(j => j % 2 == 1).ToArray(); 
input = i.Where(j => j % 2 == 1).ToArray<int>(); 

उत्तर

5

यहां कोई अंतर नहीं है। पहले कॉल में, कंपाइलर ने int टाइप किया है, जबकि दूसरे में आपने इसे स्पष्ट रूप से निर्दिष्ट किया है।

मामलों में जहां प्रकार के लिए आवश्यक है, क्योंकि यह पता नहीं लगाया जा सकता है हो सकता है। उदाहरण के लिए, आपके पास एक कस्टम संग्रह है जो दो अलग-अलग प्रकार T के लिए दो बार IEnumerable<T> लागू करता है। यह उपयोगिता को नुकसान पहुंचाता है इसलिए यह बेहतर है कि आप इस तरह के निर्माण से बचें।

4

यह वही सामान्य विधि है। पहले मामले में, सामान्य प्रकार पैरामीटर को गणना के सामान्य प्रकार पैरामीटर से कंपाइलर द्वारा अनुमानित किया जाता है जिसे आप ToArray<T>() पर कॉल कर रहे हैं। लेकिन आप इसे स्पष्ट रूप से निर्दिष्ट भी कर सकते हैं।

3

वे एक ही बात कर रहे हैं। आप "टाइप अनुमान" कहलाते हैं। कुछ परिदृश्यों में, सी # कंपाइलर पारित पैरामीटर के आधार पर प्रकार का पता लगा सकता है और आपको स्पष्ट रूप से प्रकार पैरामीटर निर्दिष्ट करने की आवश्यकता नहीं है। अपने उदाहरण में, यह जाना जाता है कि i एक IEnumerable<int> है, और इस तरह .ToArray() पैरामीटर int अनुमान लगा सकते हैं। http://joelabrahamsson.com/a-neat-little-type-inference-trick-with-c/

5

कोई अंतर नहीं है, यह ठीक उसी toArray() विधि है:

यहाँ एक अच्छा लेख है कि गहराई में इस में चला जाता है। संकलक बस अनुमान लगा सकता है कि आप अभिव्यक्ति के वाक्यविन्यास से ToArray<int> संस्करण चाहते हैं। कहां() का वापसी मूल्य int वापस करने के लिए अनुमान लगाया गया था। दूसरे शब्दों में, यह Where<int>() का उपयोग करता है। जिसे सूची <> के प्रकार से अनुमानित किया गया था। तो यह अनुमान लगा सकता है कि आपको ToArray<int> की आवश्यकता है।

तो प्रकार अनुमान श्रृंखला List<int> =>Where<int>() =>ToArray<int>() है।

बदलें करने के लिए, कहते हैं सूची, List<long> और अभिव्यक्ति अभी भी यह संशोधित करने के लिए बिना काम करता है।

2

कोई अंतर नहीं।

int[] input = i.Where(j => j % 2 == 1).ToArray(); 

यहाँ, केवल संकलक T सामान्य की गणनीय आप पर ToArray() फोन प्रकार के आधार पर तर्क का निष्कर्ष निकालते है।

input = i.Where(j => j % 2 == 1).ToArray<int>(); 

यहाँ, Where() के रिटर्न मान संकलक द्वारा मान लिया जाता है int वापस जाने के लिए।

  • ToArray<T>() जेनेरिक है इतना है कि यह किसी भी IEnumerable<T> पर काम कर सकते हैं।
  • ToArray() वास्तव में स्रोत Inumerable के T के आधार पर ToArray<T>() की अंतर्निहित व्याख्या पर रीडायरेक्ट करता है।
  • यदि आप एक सामान्य विधि कहते हैं और किसी भी प्रकार के तर्क की आपूर्ति नहीं करते हैं, तो संकलक उन्हें आपके लिए अनुमान लगाने का प्रयास करेगा।
संबंधित मुद्दे