2014-10-17 6 views
22

यहां कुछ कोड है जो मुझे हर बार परेशान करता है जब मैं इसके बारे में सोचता हूं।वीबी बनाम सी #: यह क्यों संभव है?

Option Strict On 

Module Module1 

    Sub Main() 
     For Each i As Integer In New String() {"why", "is", "this", "tolerated?"} 
      ' compiles just fine. 
     Next 
    End Sub 

End Module 

सी # बस स्ट्रिंग को पूर्णांक में पूर्ण रूप से परिवर्तित करने की अनुमति नहीं देगा।

class Program { 
    static void Main(string[] args) { 
     foreach (int i in new string[] {"that's", "better"}) { 
      // will not compile, and for good reason. 
     } 
    } 
} 

वीबी हमें ऐसा क्यों करने देता है? मैं इसके साथ मजा करने की कोशिश कर रहा हूं क्योंकि मैं अभी भी अपेक्षाकृत नया हूं, लेकिन मैं भी वास्तव में उत्सुक हूं। मुझे यकीन है कि जवाब के साथ वहाँ devs हैं।

+1

मैंने पोस्ट में 'विकल्प सख्त' कथन शामिल किया था और यह रूपांतरणों को विस्तृत करने और निहित टाइपिंग को अस्वीकार करने के लिए प्रकार रूपांतरणों को प्रतिबंधित करना है, फिर भी यह अभी भी संकलित है। – scottyeatscode

+4

@mellamokb, जैसा ओपी दिखाया गया है, यह 'विकल्प सख्त ऑन' के साथ भी काम करता है। – jmcilhinney

+0

यह एक अच्छा मुद्दा है। [इस ब्लॉग पोस्ट] के अनुसार [http://www.owenpellegrin.com/articles/vb-net/converting-strings-to-numbers/) 'विकल्प सख्त बंद' के साथ भी इसे तारों के अंतर्निहित रूपांतरण की अनुमति नहीं देनी चाहिए वैध संख्यात्मक मान नहीं, इसलिए यहां कुछ और हो रहा है।** संपादित करें **: मैंने अभी LINQPad के साथ इसे जल्दी से परीक्षण किया है और यह संकलित प्रतीत नहीं होता है ... आप इसका परीक्षण क्यों कर रहे हैं जहां आपको कंपाइलर त्रुटियां नहीं मिलती हैं? – mellamokb

उत्तर

14

यह For Each कथन का एक idiosyncrasy प्रतीत होता है। दस्तावेज़ीकरण के अनुसार इसका मूल्यांकन रनटाइम में किया जाता है।

लिंक से:

सख्त विकल्प चालू पर सेट किया जाता है, संकुचन रूपांतरण आमतौर पर संकलक त्रुटियों का कारण। प्रत्येक कथन के लिए, हालांकि, समूह से तत्व में तत्वों के रूपांतरण का मूल्यांकन और रन टाइम पर किया जाता है, और रूपांतरण को संकुचित करने के कारण संकलक त्रुटियां दबा दी जाती हैं।

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

+2

बढ़िया! धन्यवाद, मार्क! – scottyeatscode

+1

आपका स्वागत है, दिलचस्प सवाल है। –

+8

वाह - बस जब मैंने सोचा कि मैं इसे वीबी अजीबता के रूप में देखता हूं ... –

6

मार्क के उत्तर के पूरक के रूप में, यहां संकलित vb.net कोड जैसा दिखता है। जैसा कि आप देख सकते हैं कि कोड For...Next कथन में संकलित किया गया है और स्ट्रिंग को पूर्णांक में कनवर्ट करने का प्रयास करते समय त्रुटि केवल रन-टाइम पर होती है।

Dim VB$t_array$L0 As String() = New String() { "why", "is", "this", "tolerated?" } 
Dim VB$t_i4$L0 As Integer 
For VB$t_i4$L0 = 0 To VB$t_array$L0.Length - 1 
    Dim i As Integer = Conversions.ToInteger(VB$t_array$L0(VB$t_i4$L0)) 
Next VB$t_i4$L0 
+0

आप यह देखने में सक्षम थे कि कोड कैसा बदल गया है? मैं इसे प्रतिबिंबक में नहीं कर सकता 8. – scottyeatscode

+0

यदि आपके पास डेस्कटॉप एप्लिकेशन है तो आप निष्पादन योग्य फ़ाइल को असेंबली ट्रीव्यू पर खींच और छोड़ने में सक्षम होना चाहिए। –

+0

सब कुछ मेरे लिए बहुत पठनीय दिखता है, और सी # में। क्या यह अपवित्रता के बाद डिकंपिलेशन दिखता है? – scottyeatscode

11

माइक्रोसॉफ्ट भाषा विशिष्टता में इस बात के लिए क्षमा चाहते हैं, अध्याय 10.9:

यात्रा की वर्तमान तत्व लूप नियंत्रण चर के प्रकार में बदल जाती है, भले ही रूपांतरण स्पष्ट है वहाँ है, क्योंकि कथन में एक रूपांतरण ऑपरेटर शुरू करने के लिए कोई सुविधाजनक जगह नहीं है। यह सबसे आम संग्रह प्रकार, सिस्टम.कोलेक्शन.एरेलेलिस्ट के साथ काम करते समय विशेष रूप से परेशानी बन गया, क्योंकि इसका तत्व प्रकार ऑब्जेक्ट है। यह बहुत सारे लूपों में जरूरी होगा, जो कुछ हमने महसूस किया वह आदर्श नहीं था।

विडंबना यह है कि जेनेरिक ने दृढ़ता से टाइप किए गए संग्रह, System.Collections.Generic.List (टी) के निर्माण को सक्षम किया है, जो हमें इस डिजाइन बिंदु पर पुनर्विचार कर सकता है, लेकिन संगतता के लिए, अब इसे बदला नहीं जा सकता है।

0

क्या मैं अकेला हूं जो वीबी कोड में देख सकता है कि सरणी एक सामान्य (संस्करण) सरणी है जबकि सी # कोड में सख्त स्ट्रिंग सरणी है?

+1

मैंने कोड अपडेट किया है ताकि वे दोनों "सख्त स्ट्रिंग एरे" हों। कोड अभी भी कोई संकलन समय त्रुटियों को दिखाता है। मार्क हॉल, बोजर्न-रोजर क्रिंग्जा, और हंस पासेंट ने पहले से ही पर्याप्त जानकारी प्रदान की है कि यह व्यवहार क्यों होता है। – scottyeatscode

+0

वास्तव में, यदि आप बोजर्न-रोजर क्रिंग्सजा के उत्तर को देखते हैं, तो तारों की सूची आखिरकार तारों की एक सरणी बन जाती है। – scottyeatscode

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