2010-01-12 13 views
21

मेरे पास IEnumerable<T> रिटर्न के साथ एक विधि है और मैं उस विधि के अंदर कोड को डीबग करने का प्रयास कर रहा हूं।एक आईनेमरेबल विधि को डिबग करना

प्रत्येक बार जब मैं डीबग के दौरान विजुअल स्टूडियो में कोड के माध्यम से कदम उठाता हूं, तो यह प्रश्न में विधि पर कदम उठाता है।

जब मैं विधि के अंदर ब्रेकपॉइंट डालता हूं तो यह कभी भी हिट नहीं होता है। यह कोड निश्चित रूप से चल रहा है क्योंकि मैंने विधि से yield return 'नकली टी की जांच की है।

क्या इस तरह से IENumerable विधियों को डीबग करना संभव नहीं है या क्या मैं कुछ और गलत कर रहा हूं?

उत्तर

48

जब आप IENumerable में आइटम का उपयोग करते हैं तो यह विधि केवल हिट हो जाती है। याद रखें, IENumerable आलसी आइटम लोड करता है, इसलिए सिर्फ इसलिए कि आप उस विधि को कॉल कर रहे हैं जो IENumerable लौटाता है, इसका मतलब यह नहीं है कि वास्तव में उस बिंदु पर विधि को बुलाया जा रहा है। यदि आप चाहते हैं यह सही हिट करने के लिए जब आप, इसे कहते() अपने विधि कॉल के अंत में एक ToList जोड़ें:

var result = myEnumerableMethod().ToList(); 
+0

कि के लिए धन्यवाद कर सकते हैं। मुझे पता था कि एक तार्किक कारण था लेकिन क्यों याद नहीं किया जा सका। :) –

0

यह IEnumerable कार्यान्वयन डिबग करने के लिए कोई समस्या नहीं होनी चाहिए ... हो सकता है आप बस का उपयोग कर गलत .dll (आप प्रगणक बाहरी पुस्तकालय में है) ...

आप एक साधारण परीक्षण सांत्वना प्रयास करें, और यहाँ से जाना

class Program 
{ 
    static void Main(string[] args) 
    { 
     foreach (String foo in new Foo()) 
     { 
      Console.WriteLine(foo); 
     } 
    } 
} 

class Foo : IEnumerable<String> 
{ 
    #region IEnumerable<string> Members 

    public IEnumerator<string> GetEnumerator() 
    { 
     yield return "fake # 1"; 
     yield return "fake # 2"; 
    } 

    #endregion 

    #region IEnumerable Members 

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    #endregion 
} 
संबंधित मुद्दे