2012-11-23 10 views
5

से मेल नहीं खाता है मेरे पास निम्न श्रेणी और कोड कोड में परिभाषित प्रतिनिधि है (कई अन्य पंक्तियां ब्रेवटी के लिए छीन ली गई हैं)।कोई त्रुटि नहीं जब प्रतिनिधि हस्ताक्षर

Public Delegate Sub TimerCallback(canceled As Boolean) 

Public Class Timer 
    Implements TimerManager.ITimer 

    Public Sub New(delay As Integer, callback As TimerCallback) 
     mState = TimerState.Setup 
     mCallback = callback 
     CType(TimerManager.Instance, TimerManager.ITimerManager).RegisterTimer(Me, delay) 
    End Sub 
End Class 

जब मैं निम्न कोड के साथ टाइमर का एक नया उदाहरण बनाने के लिए, मैं नहीं एक संकलन त्रुटि मिलती हैं, भले ही गुमनाम समारोह के हस्ताक्षर (प्रतिनिधि के हस्ताक्षर से मेल नहीं खाता यह याद आ रही है " बूलियन "परम के रूप में रद्द)।

Dim timer As New Timer(Me.CookTime, Sub() 
             Dim cooked As FoodBase = CType(Activator.CreateInstance(SuccessfulResult), FoodBase) 
             player.GetBackpack.AddItem(cooked) 
            End Sub) 

मैं जब टाइमर इस तरह instantiating एक संकलन त्रुटि प्राप्त करने की उम्मीद, किसी को भी क्यों यह एक त्रुटि के बिना संकलन है व्याख्या कर सकते हैं? क्या कोई विकल्प है जिसे मैं सेट कर सकता हूं जिससे यह संकलन त्रुटि उत्पन्न कर सके? मेरे पास विकल्प स्पष्ट है, विकल्प सख्त विकल्प है, और प्रोजेक्ट गुणों में विकल्प का अनुमान लगाया गया है। जैसा कि है, रद्द किया गया तर्क शामिल करना भूलना बहुत आसान है।

उत्तर

4

हाँ। यह ठीक है - संकलक एक अज्ञात विधि उत्पन्न कर सकता है आवश्यक हस्ताक्षर, और बस दिए गए पैरामीटर का उपयोग न करें। तो संकलक-जेनरेट की गई विधि में पैरामीटर होगा - यह बस इसका उपयोग नहीं करेगा। आप delegate { ... } का उपयोग कर सी # में भी ऐसा कर सकते हैं।

+1

यह सुनिश्चित करने के लिए कि विधि हस्ताक्षर मिलान करता है, टाइमरकॉलबैक को तर्क को दृढ़ता से टाइप करने का मुद्दा नहीं है? विकल्प विकल्प को चालू करने पर मैं संभवतः इस व्यवहार को देख सकता था। लेकिन विकल्प को बंद करने से मैं उम्मीद करता हूं कि संकलक कुछ भी अनुमान लगाने और हस्ताक्षर को लागू करने की अपेक्षा नहीं करेगा। क्या आपके पास संकल्प को इस त्रुटि में कम से कम एक चेतावनी उत्पन्न करने के लिए मजबूर करने के बारे में मेरे प्रश्न के दूसरे भाग के लिए कोई समाधान है? –

3

इस घटना को Relaxed Delegate Conversion कहा जाता है, और विकल्प सख्त on और off पर थोड़ा अलग व्यवहार होता है। अधिक जानकारी के लिए कृपया लिंक का पालन करें।

यह है इस जैसे वीबी की एक विशेषता है, जो कॉम्पैक्ट कोड के लिए अनुमति देता है,:

Private Sub Form1_Load() Handles MyBase.Load 

आप तर्क के किसी भी उपयोग नहीं कर रहे हैं, तो उन सब को क्यों घोषित? मैं व्यक्तिगत रूप से इसे किसी समस्या के बजाय वीबी के लाभ के रूप में देखता हूं। 'Form1_Load' मैचों प्रतिनिधि 'System.EventHandler' के लिए

कोई अधिभार: आप सी # में भी ऐसा ही करने का प्रयास करते हैं, तो आप इस तरह एक संकलन त्रुटि मिलती है।

+0

तर्क/इस/उदाहरण में प्रयोग नहीं किया जा रहा है, लेकिन इसका उपयोग अन्य स्थानों में किया जा सकता है। मेरा टाइमर कोड लाइब्रेरी का हिस्सा है जो अन्य लोग अपनी परियोजनाओं में उपयोग कर सकते हैं। यदि उन उपयोगकर्ताओं को टाइमरकॉलबैक के लिए हस्ताक्षर से अवगत नहीं है, तो वे इसे शामिल करने की उपेक्षा कर सकते हैं, या टाइमर को रद्द करने की क्षमता के बारे में भी जान सकते हैं। –

+1

@BradleyUffner: VB आपको केवल पैरामीटर के साथ घोषित करने के लिए लचीलापन देता है जहां इसे पैरामीटर की आवश्यकता होती है। आप विभिन्न उपक्रमों को एक उप के तहत अलग-अलग हस्ताक्षरों के साथ भी संभाल सकते हैं, उदाहरण के लिए, लॉगिंग उद्देश्यों या डिबगिंग के लिए। उपयोगकर्ताओं को आपके उत्पाद का उपयोग करने से पहले दस्तावेज़ीकरण पढ़ना चाहिए। उसके बाद यह उनकी पसंद है कि हमेशा पूर्ण हस्ताक्षर निर्दिष्ट करें या आवश्यकता होने पर इसे छोटा करें। अधिक जानकारी के लिए मेरा संपादन देखें। – Neolisk

+0

अतिरिक्त जानकारी और इस सुविधा के वास्तविक औपचारिक नाम के लिए धन्यवाद। –

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