2010-12-01 10 views
5

इस पर उत्तर देने के बाद मुझे पता चला कि मुझे structs पर उदाहरण विधि कॉल करने के लिए ref पैरामीटर का उपयोग करना होगा। How can I create an open Delegate from a struct's instance method?क्या यह एक बग है जो Delegate.CreateDelegate संरचना सदस्य ओवरराइड से बंधे नहीं जा सकता है?

मैं स्पष्ट इंटरफेस कार्यान्वयन की तरह विधि ओवरराइड करने के लिए बाध्य करने के लिए (जुड़े मुक्केबाजी दंड, (जो वास्तव में जहाँ तक आईएल का संबंध है) को ओवरराइड करता है से बचने के लिए) नहीं कर पा रहे, यहाँ एक बग कह रिपोर्ट है कि में नेट के भविष्य के संस्करण, हम सदस्यों को एक struct पर पाया इंटरफ़ेस से आबद्ध कर सकते हैं: https://connect.microsoft.com/VisualStudio/feedback/details/574959/cannot-create-open-instance-delegate-for-value-types-methods-which-implement-an-interface?wa=wsignin1.0#details

लेकिन फिर भी Equals तरह के सदस्यों के लिए बाध्य करने की कोशिश कर, GetHashCode, या ToString त्रुटियों जैसे की ओर जाता है

public struct A 
{ 
    public override int GetHashCode(){/*implementation goes here*/} 
} 
delegate TRet FuncByRef<TStruct,TRet>(ref TStruct) where TStruct:struct 

...

Delegate.CreateDelegate(typeof(FuncByRef<A,int>),typeof(A).GetMethod("GetHashCode")); 

अपवाद "त्रुटि विधि को लक्षित करने के लिए बाध्य" के साथ असफल हो जायेगी।

+0

मुक्केबाजी ओवरहेड/आभासी पुन: ध्यान दें कि इंटरफेस उपचार केवल सामान्य बाधा के माध्यम से बाधित ओपोड के साथ उपलब्ध है। वर्चुअल विधियों का प्रबंधन इस बात पर निर्भर करता है कि क्या इसे ओवरराइड किया गया है (फिर यह स्थिर-कॉल का उपयोग कर सकता है) या नहीं (वर्चुअल-कॉल)। –

+0

@Marc Gravell, मुझे यकीन नहीं है कि यह सही है या नहीं, उदाहरण के लिए मैं एक अभिव्यक्ति वृक्ष के अंदर 'Int32.ToInt64 (शून्य)' कह सकता हूं और कोई मुक्केबाजी नहीं दिखता है। जैसा कि विधि ने इसे तेजी से किया है, अगर मैंने इसे पहले 'आईकोनवर्टिबल' –

उत्तर

0

इसके बारे में संकलक चिंता दे, अर्थात

public static string SomeHelper(A obj) { 
    return obj.SomeMethod(); 
} 

फिर "SomeHelper" के बजाय बाँध के बारे में कैसे। यह आवश्यक की एक सामान्य विधि भी हो सकती है, जहां यह जादू "बाधित" ऑपोड का उपयोग करेगा।

यह भी

Func<A string> func = obj => obj.SomeMethod(); 

के समान है आप विधि आप DynamicMethod कोशिश कर सकते हैं पाने के लिए usig प्रतिबिंब हैं।

+0

पर डाला है, जबकि मैं निश्चित रूप से इंडिकेशन स्वयं बना सकता हूं, तो मैं सोच रहा था कि सहायक विधि इसे क्यों नहीं समझ सकती। मैं निश्चित रूप से 'गेटहाशकोड' विधि द्वारा एक बाय-रेफ इंट पैरामीटर पर आक्रमण करने के लिए एक गतिशील विधि लिख सकता हूं, लेकिन मैं इस सामग्री को संभालने के लिए निर्मित विधि का उपयोग क्यों नहीं कर सकता? –

+0

@ माइकलबी - क्या आपने कभी इसे समझ लिया है? – smartcaveman

+0

हां, .NET के बाद के संस्करण में अपग्रेड करना, अर्थात् 4.5 ने समस्या को हल किया। –

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