इस पर उत्तर देने के बाद मुझे पता चला कि मुझे 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"));
अपवाद "त्रुटि विधि को लक्षित करने के लिए बाध्य" के साथ असफल हो जायेगी।
मुक्केबाजी ओवरहेड/आभासी पुन: ध्यान दें कि इंटरफेस उपचार केवल सामान्य बाधा के माध्यम से बाधित ओपोड के साथ उपलब्ध है। वर्चुअल विधियों का प्रबंधन इस बात पर निर्भर करता है कि क्या इसे ओवरराइड किया गया है (फिर यह स्थिर-कॉल का उपयोग कर सकता है) या नहीं (वर्चुअल-कॉल)। –
@Marc Gravell, मुझे यकीन नहीं है कि यह सही है या नहीं, उदाहरण के लिए मैं एक अभिव्यक्ति वृक्ष के अंदर 'Int32.ToInt64 (शून्य)' कह सकता हूं और कोई मुक्केबाजी नहीं दिखता है। जैसा कि विधि ने इसे तेजी से किया है, अगर मैंने इसे पहले 'आईकोनवर्टिबल' –