2010-06-02 17 views
10

मैं समझने की क्या नीचे कोड में संकलन त्रुटि का कारण बनता है एक समस्या है मुझे लगता है कि foo ऑपरेशन रनटाइम पर हल किया जाएगा, जो ठीक है क्योंकि मैं एक गतिशील प्रकार को एक param के रूप में उपयोग कर रहा हूं। हालांकि मुझे समझ में नहीं आता कि if स्विच स्विच करते समय ठीक से कैसे संकलित करता है।.NET में अजीब स्विच व्यवहार 4

ऊपर कोड सिर्फ मैं क्या मेरे आवेदन (VSTO) जो VSTO4 को VSTO3 से एप्लिकेशन को पलायन जब VSTO में एक विधि object के बजाय dynamic प्रकार मान में बदल गया था के बाद दिखाई दिया में है का संस्करण सरलीकृत है।

क्या कोई मुझे स्पष्टीकरण दे सकता है कि समस्या क्या है। मुझे पता है कि इसे कैसे हल किया जाए लेकिन मैं समझना चाहता हूं कि क्या हो रहा है।

+0

ऐसा लगता है कि आप –

+0

स्विच को डकटाइप नहीं कर सकते हैं क्योंकि प्रत्येक संभावित ऑब्जेक्ट प्रकार – thecoop

+0

के लिए 'स्विच' परिभाषित नहीं किया गया है, हर कोई ऐसा जवाब दे रहा है जैसे सवाल है "मैं गतिशील पर क्यों नहीं बदल सकता '?" मुझे लगता है कि प्रश्न वास्तव में होना चाहिए "पहली जगह 'गतिशील' के रूप में टाइप किया गया 'परीक्षण' क्यों है?" मुझे लगता है कि * अगर * 'foo' अधिभार था जो विभिन्न प्रकारों को लौटाता था, 'test' को' गतिशील 'होना होगा; लेकिन चूंकि यह * नहीं * है, मुझे अभी भी "वास्तविक" प्रश्न का उत्तर देने में परेशानी हो रही है। –

उत्तर

10

क्योंकि आप एक विधि गतिशील कॉल कर रहे हैं, परिणाम भी है एक dynamic (वापसी मान कुछ भी हो सकता है के रूप में - यह क्रम जब तक पता नहीं है)। और आप dynamic परिवर्तनीय प्रकार पर switch नहीं कर सकते हैं।

+0

और 'गतिशील' पर 'if' ठीक है? – RaYell

+0

@RaYell: आप 'गतिशील 'पर नहीं हैं" - आप' गतिशील 'पर समानता '==' की तुलना करते हैं। यह अच्छी तरह से परिभाषित है। – Niki

+0

ठीक है, यह समझ में आता है। – RaYell

0

यह कुछ अप्रत्याशित व्यवहार है - मैं एक विधि को एक var सेट की अपेक्षा करता था जो एक स्ट्रिंग प्रकार को सही तरीके से अनुमान लगाने के लिए स्पष्ट रूप से एक स्ट्रिंग देता है। ओह अच्छा .....

यदि आप बदल देते हैं:

वर परीक्षण = foo (x);

के साथ:

स्ट्रिंग टेस्ट = foo (x);

यह सब संकलित करता है जैसा आप जानते हैं।

यह सुरक्षित है क्योंकि आपने foo() को एक स्ट्रिंग लौटने के रूप में घोषित किया है, और शायद लंबे समय तक लंबे समय तक पढ़ने के लिए थोड़ा और सहज ज्ञान युक्त है।

+0

'var' को रनटाइम पर हल नहीं किया जा सकता क्योंकि x गतिशील है। संभावित रूप से 'foo' के एकाधिक अधिभार हो सकते हैं जिनमें विभिन्न पैरामीटर और रिटर्न प्रकार होते हैं।वास्तव में क्या होता है तब तक हल नहीं किया जा सकता जब तक कि x के प्रकार को ज्ञात नहीं किया जाता है, जो रनटाइम तक नहीं होगा। वास्तव में क्या होता है कि var 'गतिशील' के लिए हल हो जाता है, यही कारण है कि इसे स्विच में उपयोग नहीं किया जा सकता है। यदि आप 'माउस' पर अपने माउस पॉइंटर को घुमाते हैं तो आप देखेंगे कि विजुअल स्टूडियो इसे 'गतिशील' –

+0

पर हल कर रहा है हां - मैं इसे देख रहा हूं। मुझे लगता है कि मैंने अभी माना है कि जब विधि कॉल किया गया था, उस दायरे में एक विधि की उपस्थिति का सामना करते समय विभिन्न अनुमान अधिक स्मार्ट थे। लेकिन आप जानते हैं कि वे धारणाओं के बारे में क्या कहते हैं .... =) –

3

स्विच अभिव्यक्ति का प्रकार संकलन समय पर संकलक द्वारा मूल्यांकन किया जाता है। dynamic का प्रकार रनटाइम में मूल्यांकन किया जाता है, इसलिए संकलक यह सत्यापित नहीं कर सकता कि यह स्वीकृत प्रकारों में से एक है (या परिवर्तनीय है) (जो C# 4 Language Specification के अनुसार sbyte, बाइट, लघु, ushort, int, uint, long, उलंग, बूल, चार, स्ट्रिंग, या एनम-टाइप)।

2

मैट एलन कहते हैं, लेकिन थोड़ी अधिक पृष्ठभूमि के साथ।

switch बयान के लिए: सी # भाषा विशिष्टता v4.0 से:

शासी प्रकार एक switch बयान के स्विच अभिव्यक्ति द्वारा स्थापित है।

  • तो स्विच अभिव्यक्ति के प्रकार sbyte, byte, short, ushort, int, uint, long, ulong, bool, char, string, या एक enum प्रकार, या अगर यह व्यर्थ है इन प्रकारों में से किसी एक के अनुरूप टाइप करें, फिर यह switch कथन का शासी प्रकार है। sbyte, byte, short, ushort, int, uint, long, ulong,:
  • अन्यथा, ठीक एक उपयोगकर्ता परिभाषित अंतर्निहित (§6.4) रूपांतरण स्विच अभिव्यक्ति के प्रकार से संभव शासी प्रकार निम्न में से एक के लिए मौजूद होना चाहिए char, string, या, उन प्रकारों में से एक के अनुरूप एक शून्य प्रकार।
  • अन्यथा, यदि कोई ऐसा निहित रूपांतरण मौजूद नहीं है, या यदि एक से अधिक ऐसे अंतर्निहित रूपांतरण मौजूद हैं, तो संकलन-समय त्रुटि उत्पन्न होती है।

if बयान अभिव्यक्ति एक बूलियन आपरेशन के रूप में मूल्यांकन किया जाता है के लिए

। परिवर्तनीय असाइनमेंट में विधि कॉल में dynamic के उपयोग की वजह से अभिव्यक्ति मूल्यांकन रन-टाइम को स्थगित कर दिया गया है। उपरोक्त विनिर्देशन से, ऐसा लगता है कि switch स्विच प्रकारों के संकलन-समय मूल्यांकन की आवश्यकता है।

0

स्विच स्टेटमेंट केवल संख्याओं, वर्णों, enums और तारों का समर्थन करते हैं। dynamic उन चीजों में से कोई नहीं है। आप मानते हैं कि x एक स्ट्रिंग है, तो आप बस इसे डाली कर सकते हैं:

dynamic x = ""; 
string test = (string)foo(x); 

अगर यह नहीं है तुम सिर्फ एक रनटाइम त्रुटि मिल जाएगा।

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