2010-08-02 14 views
15

आबंटित नहीं है। मैं Do2 के अंदर कोड को पसंद नहीं करता क्योंकि यह अजीब लगता है कि मेरे पास काम करने के लिए टाइप प्रकार action("") है।तर्क प्रकार 'शून्य' यह मेरा परीक्षण कोड है पैरामीटर के लिए प्रकार 'System.Action'

क्या कोई कृपया उन 2 चीजों को समझा सकता है जिन्हें मैं समझ नहीं पा रहा हूं?

  1. मैं क्यों नहीं क्यों मैं कार्रवाई ("") है ताकि इसे Do2 में
+0

मैं हमेशा उत्तर है कि मुझे मदद की बाहर चिह्नित। यदि कोई समाधान नहीं है जो कुछ उपयोगी प्रदान करता है तो मैं इसे तब तक चिह्नित नहीं करता जब तक कि मुझे वह जवाब न मिले जो मुझे मदद करता है। –

उत्तर

32
dsufac.Do(WriteToConsoleWithSomethingExtra("Test")); 

वास्तव में काम करने के लिए मिल में लिखने के लिए है

  • बुला के साथ उस तरह तीसरी पंक्ति लिख सकते हैं पहले फ़ंक्शन को कॉल करता है (WriteToConsoleWithSomethingExtra("Test")) और फिर परिणाम को Do में पास करने का प्रयास करता है। चूंकि कोई परिणाम नहीं है (void), यह संभव नहीं है।

    यह क्या आप वास्तव में चाहते हैं:

    dsufac.Do(() => WriteToConsoleWithSomethingExtra("Test")); 
    

    भीतरी भाग वाणी एक समारोह है कि जो WriteToConsoleWithSomethingExtra("Test") कॉल निष्पादित कुछ भी नहीं (() => बिट) लेता है,। फिर आपके dsufac.Do कॉल को एक क्रिया प्राप्त होगी, जैसा कि यह अपेक्षा करता है।

    Do2 का सवाल है - आप इसे Action<String> ले, जिसका अर्थ है कि action एक समारोह है कि एक तर्क लेता है के रूप में घोषित किया है। आपको इसे एक स्ट्रिंग पास करनी है। यही कारण है कि स्ट्रिंग अपने action("") उदाहरण में खाली हो सकता है, की तरह है, या यह कुछ इस तरह बाहरी रूप में पारित किया जा सकता है, के रूप में:

    dsufac.Do3(WriteToConsole, "Test"); 
    
    ... 
    
    internal void Do3(Action<String> action, String str) 
    { 
        action(str); 
    } 
    
  • +0

    वाह! यह काम करता है। मुझे अभी भी उस एक्शन और फनक सामान के साथ बहुत सारी समस्याएं आ रही हैं। क्या एमएसडीएन या किताबों के अलावा आप कुछ सभ्य ट्यूटोरियल सुझा सकते हैं? मैं आपके उत्तर को इस तरह चिह्नित करूंगा जब यह मुझे अनुमति देता है (स्पष्ट रूप से किसी और के लिए इंतजार करना पड़ता है ... मिनट)। –

    +0

    अतिरिक्त अद्यतन के लिए धन्यवाद। –

    1
    1. क्या एक Action (यानी विधि है जो कोई पैरामीटर नहीं की उम्मीद है और कोई मान देता है)। इसलिए WriteToConsoleWithSomethingExtra मान्य फिट नहीं है - एक स्ट्रिंग पैरामीटर लेता है।
    2. Do2 Action<T> स्वीकार करता है (यानी विधि जो एक टी पैरामीटर में लेती है और कोई मान नहीं देती है)। इसलिए जब आप प्रतिनिधि/कार्रवाई का आह्वान करते हैं तो आपको स्ट्रिंग के प्रकार टी के एक पैरामीटर की आपूर्ति करने की आवश्यकता होती है।
    3

    अपने कोड

    dsufac.Do(WriteToConsoleWithSomethingExtra("Test")); 
    

    में निम्नलिखित

    var variable = WriteToConsoleWithSomethingExtra("Test"); 
    dsufac.Do(variable); 
    

    WriteToConsoleWithSomethingExtra की वापसी प्रकार के रूप में की तरह व्याख्या की है ("टेस्ट") शून्य है, तो आप वास्तव में करने के लिए इसे पारित नहीं कर सकते dsufac.Do()। यही कारण है कि यह संकलित नहीं हो रहा है। लेकिन पहले एक

    dsufac.Do(WriteToConsole); 
    

    के लिए आप फ़ंक्शन को कॉल नहीं कर रहे हैं, बल्कि आप एक विधि समूह, जो बाद में dsufac वस्तु की विधि क्या() में लागू हो गया है के रूप में यह गुजर रहे हैं।लेकिन अगर आप 1 एक के रूप में 3 लाइन लिखना चाहते हैं, तो आप उपयोग कर सकते हैं

    dsufac.Do(() => WriteToConsoleWithSomethingExtra("Test")); 
    
    1

    मैं एक Silverlight अनुप्रयोग में थोड़ी देर के लिए कुछ इस तरह कर रहा था। अब, जब यह चलता है, तो इसका हिस्सा टूट जाता है।
    यह एक सिल्वरलाइट चाइल्ड विंडो में क्या होता है:

    (my object context).SaveChanges(() => ChangesSaved()); 
    
    private void ChagngesSaved() 
    { 
        DialogResult = true: // is supposed to close the child window. line gets hit, does not close 
    } 
    
    संबंधित मुद्दे