2011-01-10 15 views
16

यदि आप Visual Basic .NET में नीचे दी गई क्वेरी को संकलित करने का प्रयास करते हैं, तो यह विफल हो जाता है।मैं वीबी में ToString() क्यों प्रोजेक्ट नहीं कर सकता?

From x In {1, 2} Select x.ToString() 

संकलक द्वारा दिए गए त्रुटि है:

रेंज चर नाम 'वस्तु' वर्ग के एक सदस्य के नाम से मेल नहीं कर सकते।

, हालांकि बराबर सी # क्वेरी के साथ गलत कुछ भी नहीं है:

from x in new[]{1, 2} select x.ToString() 

यह ToString अधिभार है कि एक प्रारूप लेता है के साथ ऐसा नहीं होता है (यह Int32 के एक सदस्य है, वस्तु नहीं)। यह ऑब्जेक्ट के अन्य सदस्यों के साथ होता है, जब तक वे कोई तर्क नहीं लेते: GetType और GetHashCode के साथ यह विफल हो जाता है; बराबर (ऑब्जेक्ट) के साथ यह संकलित करता है।

यह प्रतिबंध क्यों है, और मैं किस विकल्प का उपयोग कर सकता हूं?

+0

दिलचस्प। 'X में {1, 2} x.oString ("d") का चयन करें, संकलित करता है, संभवतः क्योंकि' ऑब्जेक्ट 'में यह नहीं है। हालांकि मुझे कोई वीबी नहीं पता है, लेकिन यह अजीब लग रहा है। – Kobi

+0

@ कोबी: मुझे लगता है कि आपका उदाहरण संकलित करता है क्योंकि 'ऑब्जेक्ट' में कोई 'ToString' सदस्य नहीं है जो तर्क लेता है। यह एक समस्या क्यों होगी मुझे पहेली क्या है। –

+0

मुझे लगता है कि ऐसा इसलिए है क्योंकि यह तर्क के साथ बुलाए जाने पर स्पष्ट रूप से एक संपत्ति नहीं है, और इसलिए वीबी जानता है कि आप 'ToString' संपत्ति के साथ अज्ञात ऑब्जेक्ट बनाने के लिए इसका उपयोग नहीं कर रहे हैं - जबकि यह किसी अन्य को गलत बनाता है। (जो हो सकता है कि आप क्या कह रहे थे - मैं वीबी विशेषज्ञ नहीं हूं।) – Rup

उत्तर

10

यहां मैं इसे कैसे समझता हूं। निम्नलिखित कोड पर विचार करें: ऊपर

Dim q = From x In {"Bob", "Larry"} 
     Select x.Length 
     Select Length * 2 

क्वेरी में, Length वैरिएबल का नाम स्वचालित रूप से वीबी अभिव्यक्ति x.Length के आधार पर संकलक द्वारा आप के लिए "अनुमान लगाया है।" अब, यह सच है कि आपने इस के लिए नहीं पूछा; यह सिर्फ एक सुविधा है जो प्रदान की जाती है कि आप इसे पसंद करते हैं या नहीं। लेकिन अब इस पर विचार करें:

Dim q = From x In {"Bob", "Larry"} 
     Select (x.Length) 
     Select Length * 2 

ऊपर संकलन नहीं है क्योंकि पहले Select खंड के अंदर अभिव्यक्ति पहला मामला (मानो या न मानो) में के रूप में सरल नहीं है, कोष्ठक संकलक के लिए पर्याप्त मामलों को जटिल बनाते हैं जो नाम Length नहीं चुनते हैं; इसके बजाए, यह एक ऐसा नाम उत्पन्न करता है जो कोड से उपयोग योग्य नहीं है।

तो मूल रूप से क्या ToString() साथ हो रहा है कि इस अभिव्यक्ति काफी सरल संकलक एक चर नाम, यदि क्वेरी इस चर का उपयोग करने के लिए विस्तार किया गया जो इस्तेमाल किया जा सकता है, उदा उत्पन्न करने के लिए उपयोग करने के लिए है:

Dim q = From x In { 1, 2 } 
     Select x.ToString() 
     Select ToString.Length 

हालांकि, ToString नहीं एक चर के लिए एक कानूनी नाम के बाद से यह (System.Object के एक सदस्य क्यों इस LINQ प्रश्नों के भीतर चर के लिए लेकिन मानक स्थानीय चर के लिए नहीं मामला होगा है, है मैं यह नहीं कह सकता)।

+0

भगवान, मुझे इस सुविधा से नफरत है। मैं देखता हूं कि यह कैसे उपयोगी हो सकता है, लेकिन यह जिस समस्या को बनाता है वह दिमागी दबदबा है और मेरा उदाहरण दुर्लभ उपयोग के मामले से बहुत दूर है। मैं नहीं देखता कि एक अंतर्दृष्टि त्रुटि संदेश कैसे प्रदान किया जा सकता है, लेकिन मुझे लगता है कि संकलक स्वचालित रूप से नाम का "अनुमान नहीं लगाया जाना चाहिए" अगर यह वैध नाम नहीं था। –

5

मैं त्रुटि, एक सरल समाधान का के बारे में विवरण प्रदान नहीं लगा सकते कि यह:

From x In {1, 2, 3} Let str = x.ToString() Select str 

क्या इसके लायक है, के लिए आप निम्न पंक्ति है जब:

Dim b = From num In {1, 2, 3} Select num.ToString("d") 

यह है compiles और (परावर्तक का उपयोग कर, सी # करने के लिए) के लिए decompiles:

public class Class1 
{ 
    [CompilerGenerated] 
    private static string _Lambda$__1(int num) 
    { 
     return num.ToString("d"); 
    } 

    public void Test1() 
    { 
     IEnumerable<string> b = new int[] { 1, 2, 3 } 
      .Select<int, string>(new Func<int, string>(Class1._Lambda$__1)); 
    } 
} 

कोई गुमनाम वर्ग अल होना प्रतीत नहीं होता है रास्ते पर

34

मैं आपको क्यों नहीं बता सकता था वीबी में यह हास्यास्पदता है, लेकिन सरल कामकाज माता-पिता में विधि कॉल डालना है।

Dim q = From x In {1, 2} Select (x.ToString()) 
+6

जैसा कि मेरा सिर बस विस्फोट हुआ है। –

+0

धन्यवाद tnyfst.I ने resharper से एक सुझाए गए कोड सुधार को लागू किया है, लेकिन यह अचानक त्रुटि फेंक रहा है। तो मैंने आपके द्वारा सुझाए गए अनुसार कोष्ठक डाल दिया और यह काफी काम करता है। धन्यवाद –

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