2012-02-22 6 views
6

मैं विरासत कोड है जो निम्न सहायकमैं कैसे Func <T,R> के लिए प्रतिनिधि आर समारोह <T,R> (टी टी) को परिवर्तित करते हैं?

public delegate R Function<T, R>(T t); 

परिभाषित मिल गया है लेकिन मैं एक Func<T,TResult>

कास्टिंग प्रयास संकलित करने के लिए असफल आपूर्ति करने के लिए चाहते हैं

के प्रकार 'System.Func<T,TResult>' कनवर्ट नहीं कर सकता ' Rhino.Mocks.Function<T,TResult> '

क्या कोई तरीका नहीं है टोपी न केवल संकलित करता है, लेकिन रनटाइम पर काम करता है? Func<T, TResult> और Function<T, TResult>:

उत्तर

9

समस्या आप दो अलग अलग प्रतिनिधि प्रकार गठबंधन करने के लिए कोशिश कर रहे हैं। भले ही उनके पास एक ही हस्ताक्षर है, वे अलग हैं, और इसलिए असंगत, प्रकार।

दोनों के बीच एक रूपांतरण परत बनाने के लिए एक लैम्ब्डा का प्रयोग करें।

Func<T, TResult> func = ...; 
TheMethod(x => func(x)); 
+0

आह, ठीक है। चीजें लिखना अक्सर मेरा आखिरी उपाय है। एक बार एसओ अनुमति देता है स्वीकार करेंगे। – Maslow

8

आप के रूप JaredPar चलता है कि एक लैम्ब्डा बना सकते हैं, या अन्य की निर्माता के लिए एक पारित:

Func<int, string> f1 = i => i.ToString(); 
Function<int, string> f2 = new Function<int, string>(f1); 
+1

लैम्बडा अभिव्यक्ति को ठीक करने के लिए @EricLippert के लिए धन्यवाद; मैंने कुछ दोपहर एफ # में काम किया था, जो '=>' के बजाय '->' का उपयोग करता है। – phoog

9

जारेड और phoog दोनों सही हैं। , बस इसे बाहर पूर्णांक बनाना, एक ही बात करने के लिए एक तीसरा रास्ता है:

Func<int, string> func = i => i.ToString(); 
Function<int, string> function = func.Invoke; 

है, नए प्रतिनिधि पहले प्रतिनिधि, जो सही हस्ताक्षर हैं के आह्वान विधि के लिए एक प्रतिनिधि है।

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

+0

मुझे यकीन नहीं है कि रनटाइम इस मुद्दे पर हमला करने का सही स्तर है या नहीं। विशेष रूप से मुझे यकीन नहीं है कि वे परिवर्तन पैरामीटर नामों के साथ कितनी अच्छी तरह से बातचीत करेंगे। – CodesInChaos

+0

तो यह सुविधा लागू करने था मुक्त है (यानी, परीक्षण की आवश्यकता नहीं होगी, डेवलपर समय अन्य सुविधाओं से दूर ले, 0 अंक के बजाय -100 अंक, आदि पर शुरू कर दिया), वहाँ यह लागू करने के लिए किसी भी प्रमुख कमियां हो सकता है? – Brian

+0

यदि मैं सही ढंग से समझता हूं, क्योंकि यह संकलित नहीं होता है, तो यह रनटाइम के साथ ठीक होने में मदद नहीं करेगा। – Maslow

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