2011-02-12 8 views
16

ठीक है तो मैं एक जावा लड़का हूं जो सी # का उपयोग शुरू कर रहा है और मैं कोडिंग कर रहा था और एक सामान्य विधि बनाना शुरू कर दिया और मैंने जो लिखा और संकलित किया, लेकिन यह सब कुछ है जो मुझे पता है कि जेनेरिकों को कैसे काम करना चाहिए इसलिए मैं आशा करती हूं कि किसी ने मुझे यह समझाने कर सकते हैं:सी # टाइप करने के बिना सामान्य विधि

public static List<T> CopyAsList<T>(IEnumerable<T> list, Object lockObject) 
{ 
    if (list != null) 
    { 
     lock (lockObject) 
     { 
      return new List<T>(list); 
     } 
    } 
    return null; 
} 

लेकिन मुझे अजीब बात यह है कि मैं कभी भी निर्धारित किए बिना ही इस सामान्य विधि कॉल कर सकते हैं:

तो मैं एक सामान्य विधि इस प्रकार परिभाषित किया गया है T और यह काम करेगा:

List<String> strings = new List<string>() { "a", "b", "c"}; 
List<int> ints = new List<int>() { 1,2,3}; 
object lockObject = new object(); 

foreach (string s in CopyAsList(strings, lockObject)) 
{ 
    Console.WriteLine(s); 
} 

foreach (int i in CopyAsList(ints, lockObject)) 
{ 
    Console.WriteLine(i); 
} 

यह कोड जेनेरिक प्रकार निर्दिष्ट किए बिना संकलित करने में सक्षम कैसे है? क्या सी # रनटाइम पर प्रकार का अनुमान लगाता है?

+6

वहाँ कार्यावधि में अब और कोई सी # है। – Gabe

+0

सी # कंपाइलर संकलन समय पर प्रकार का अनुमान लगाता है। एक तरफ ध्यान दें, सीएलआर (डीएलआर) रन टाइम पर प्रकार का अनुमान लगा सकता है, सी # से 'गतिशील' कीवर्ड देखें। – kizzx2

+1

kizzx2: ओपी ने '.net-3.5' के साथ प्रश्न को टैग किया जो संदर्भ से 'गतिशील' को समाप्त करता है, और रनटाइम पर कोई प्रकार का संदर्भ नहीं होता है - डीएलआर प्रकार निर्धारित करने के लिए प्रतिबिंब का उपयोग करता है। – Gabe

उत्तर

35

नहीं, यह संकलन समय पर अनुमानित है - IEnumerable<T> में सामान्य प्रकार पैरामीटर आप आपूर्ति का उपयोग किया जाता है, जिसे संकलन समय पर जाना जाता है। आम तौर पर, जेनरिक्स और टाइप पैरामीटर के बारे में सब कुछ संकलन समय पर निर्दिष्ट किया गया है। यदि किसी भी प्रकार का मेल नहीं है, तो संकलक शिकायत करेगा और आपका कोड संकलित नहीं होगा।

ऐसे किनारे के मामले हैं जहां आपको स्पष्ट रूप से प्रकार निर्दिष्ट करना होगा, ये केवल दुर्लभ परिस्थितियों में ओवरलोडेड विधियों के साथ होता है, कभी-कभी प्रकार पैरामीटर के कई संयोजनों के साथ।

+0

उन परिस्थितियों में से एक यह है कि जब किसी विधि के लिए कोई तर्क गतिशील टाइप किया जाता है - एक बार जब आप वहां फेंक देते हैं तो सभी कंपाइलर जेनेरिक प्रकार अनुमान खिड़की से बाहर होता है, भले ही सभी समान संकेत हों। –

11

सी # कंपाइलर अक्सर संकलित समय संकलित समय पर सामान्य प्रकार का अनुमान लगा सकता है। जब यह ऐसा कर सकता है, तो आपको सामान्य विधि के प्रकार को निर्दिष्ट करने की आवश्यकता नहीं है।

यह LINQ "उपयोग करने योग्य" बनाता है इसका एक प्रमुख हिस्सा है।

IEnumerable<int> myIds = myCollection 
          .Where<MyType>(i => i.Name == "Foo") 
          .Select<MyType, int>(i => i.Id); 

लिखने में सक्षम होने के बावजूद: संकलन समय प्रकार निष्कर्ष के बिना, प्रश्नों कैसा दिखेगा

var myIds = myCollection.Where(i => i.Name == "Foo").Select(i => i.Id); 
+3

और गुमनाम प्रकारों के साथ प्रश्न असंभव होंगे, अगर, कंपाइलर द्वारा प्रकार कम नहीं किया जाएगा, तो कोड संकलित नहीं होगा। – Femaref

+0

टाइप अनुमान के बिना, कंपाइलर नहीं जानता कि उन भेड़ के बच्चे के पास क्या प्रकार होगा। – Gabe

12

सी # एक महान कई और अधिक संकलन समय और जावा के अलावा क्रम प्रकार निष्कर्ष विशेषताएं है। आप विशेष रूप से सामान्य विधि प्रकार निष्कर्ष में रुचि रखते हैं और आप अतिरिक्त आधे घंटे है, तो

http://blogs.msdn.com/b/ericlippert/archive/tags/type+inference/

, यहाँ मुझे समझा कि हम कैसे बदल गया है: इस विषय अपनी रुचि है, तो इस विषय पर मेरे लेख को देखने के सी # 3 में प्रकार निष्कर्ष एल्गोरिथ्म:

http://blogs.msdn.com/b/ericlippert/archive/2006/11/17/a-face-made-for-email-part-three.aspx

+0

"रनटाइम प्रकार अनुमान फ़ीचर" आप किस विशेषता के बारे में बात कर रहे हैं? कुछ गतिशील 'से संबंधित है? – CodesInChaos

+0

@CodeInChaos: हां, सी # में "गतिशील" का अर्थ है "रनटाइम पर इस अभिव्यक्ति के प्रकार विश्लेषण का काम करें, समय संकलित नहीं करें"। –

+0

मुझे पता है कि 'गतिशील' क्या करता है। मैं सिर्फ यह जानना चाहता था कि क्या आप 'गतिशील' सुविधा के बाहर कुछ रनटाइम प्रकार अनुमान के बारे में बात कर रहे थे। – CodesInChaos

संबंधित मुद्दे