2015-04-28 10 views
6

पर लागू रूपांतरण मैं (विशिष्ट) लैम्ब्डा अभिव्यक्तियों से एक अंतर्निहित रूपांतरण को उपयोगकर्ता द्वारा परिभाषित प्रकार में परिभाषित करना चाहता हूं। मैं निम्नलिखित की कोशिश की:लैम्ब्डा अभिव्यक्ति से उपयोगकर्ता परिभाषित प्रकार

public static implicit operator DualElement<T>(Func<OPTatom, OPTatom, T> atomMap) 
{ 
    return new DualElement<T>(e => atomMap(e[0],e[1])); 
} 

तो मैं करने की कोशिश की

DualElement<double> dubidu = (i, j) => cost[i, j]; 

जो देता है "कनवर्ट नहीं कर सकता लैम्ब्डा अभिव्यक्ति ... क्योंकि यह एक प्रतिनिधि प्रकार नहीं है"

इसके बजाय, क्या काम करता है:

DualElement<double> dideldu = (Func<OPTatom, OPTatom, double>)((i, j) => cost[i, j]); 

मुझे लगता है, लैम्ब्डा भाव प्रकार 'समारोह' की जरूरत नहीं है, इसलिए है कि मैं कुछ di डाल करने के लिए है निहित रूपांतरण में fferent।

क्या कोई मुझे संकेत दे सकता है?

+0

'' DualElement'' की परिभाषा क्या है? –

+0

@ सजदद: मेरे पास अलग-अलग लैम्ब्डा अभिव्यक्तियां हैं जिनका अर्थ है "ओपीटीटीमेंट टू टी के तत्व से एक कार्य"। मेरा उद्देश्य उन्हें एक ही प्रकार में पूर्ण रूप से परिवर्तित करना है ताकि मुझे हर विधि को अधिभारित करने की आवश्यकता न हो DualElement से आया था। –

उत्तर

3

आपका कामकाज बहुत अच्छा है।
लैम्ब्डास में स्वयं का कोई प्रकार नहीं है, इसलिए उन्हें कुछ उचित प्रकार में डाला जाना चाहिए।
कृपया MSDN देखें:

ध्यान दें कि अपने आप में लैम्ब्डा भाव एक प्रकार क्योंकि आम प्रकार प्रणाली की कोई आंतरिक अवधारणा है नहीं है "लैम्ब्डा अभिव्यक्ति।" हालांकि, कभी-कभी लैम्ब्डा अभिव्यक्ति के "प्रकार" के अनौपचारिक रूप से बोलना सुविधाजनक होता है। इन मामलों में प्रकार प्रतिनिधि प्रकार या अभिव्यक्ति प्रकार को संदर्भित करता है जिसमें लैम्ब्डा अभिव्यक्ति परिवर्तित होती है।

यही कारण है कि निम्न उदाहरण संकलन नहीं होगा:

var func = (i, j) => i + j; 
+0

@ जेनिशराबादिया मैंने सोचा कि ओपी * लैम्ब्डा * को 'ड्यूलएमेंट' में असाइन करने का प्रयास कर रहा है। लेकिन भेड़ के बच्चे के पास कोई प्रकार नहीं है। इसलिए प्रारंभिक कनवर्टिंग लैम्ब्डा 'फनक' में मदद करता है। और मेरा नमूना संकलित नहीं होगा, इसे स्वयं आज़माएं। – Dmitry

+0

@ जेनिशराबादिया वास्तव में ओपी एक अंतर्निहित ऑपरेटर का उपयोग कर 'ड्यूलइलेमेंट' को तत्काल करना चाहता है, जैसे कि लिंक-टू-एक्सएमएल में आप 'एक्सएनएम फू = "बार' 'का उपयोग कर सकते हैं। – Dirk

+0

क्या इसका मतलब यह है कि किसी अन्य प्रकार के लैम्ब्डा अभिव्यक्ति से एक अंतर्निहित रूपांतरण सी # में असंभव है? –

1

आप Func<OPTatom, OPTatom, T> प्रतिनिधि प्रकार से अंतर्निहित ऑपरेटर परिभाषित और जो सी # संकलक करने के लिए अजीब लगता है लैम्ब्डा अभिव्यक्ति से रूपांतरण करने की कोशिश कर रहे हैं।

इसके बजाय Func<OPTatom, OPTatom, T> के कुछ चर में लैम्ब्डा अभिव्यक्ति को संग्रहीत करें और फिर निहित रूपांतरण करें। निम्नलिखित यहाँ काम करेगा:

Func<OPTatom, OPTatom, T> temp = (i, j) => cost[i, j]; 
DualElement<double> dubidu = temp; 

मैं डेमो बनाया है और यह ठीक काम किया।

public class Program 
{ 
    public static void Main() 
    { 
     Func<string, bool> func = d => true; 
     Process<bool> p = func; 
     //Process<bool> p = d => true; would result in error 
    } 
} 

public class Process<T> 
{ 
    public Process(T item) 
    { 
     Item = item; 
    } 

    public T Item 
    { 
     get; 
     set; 
    } 

    public static implicit operator Process<T>(Func<string, T> func) 
    { 
     return new Process<T>(func("jenish")); 
    } 
} 

Here यदि आप इसके साथ खेलना चाहते हैं तो dotnetfiddle लिंक है।

+0

धन्यवाद। लेकिन मेरा मूल उद्देश्य विधियों के मानकों के रूप में विभिन्न लैम्ब्डा अभिव्यक्तियों का उपयोग करना था। फिलहाल, मैं दोहरीकरण का उपभोग करने वाली प्रत्येक विधि के लिए चार ओवरलोडेड विधियों को लिखता हूं क्योंकि मैं विधियों के लिए उपयोग का आसान तरीका चाहता हूं (लैम्ब्डा अभिव्यक्तियों के संदर्भ में)। मैंने इस चौगुनी से बचने की कोशिश की लेकिन जाहिर है, ऐसा करना संभव नहीं है। –

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