2009-02-19 20 views
29

सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है, क्योंकि 'लैम्ब्डा अभिव्यक्ति' और 'लैम्ब्डा अभिव्यक्ति'सी #: 'लैम्ब्डा अभिव्यक्ति' और 'लैम्ब्डा अभिव्यक्ति' के बीच कोई अंतर्निहित रूपांतरण नहीं है?

कहो whaat के बीच कोई अंतर्निहित रूपांतरण है वहाँ? क्या कोई मुझे इस संकलन त्रुटि को समझा सकता है?

protected override Func<System.IO.Stream> GetStream() 
    { 
     return someBool 
      ?() => EmbeddedResourceExtractor.GetFile("SomeFile1.ext") 
      :() => EmbeddedResourceExtractor.GetFile("SomeFile2.ext"); 
    } 

यह नहीं करता है::

protected override Func<System.IO.Stream> GetStream() 
    { 
     return() => EmbeddedResourceExtractor.GetFile("SomeFile1.ext"); 
    } 

और न ऐसा करते हैं: यह कोड है कि यह उत्पादन होता है

protected override Func<System.IO.Stream> GetStream() 
    { 
     if(someBool) 
      return() => EmbeddedResourceExtractor.GetFile("SomeFile1.ext"); 
     return() => EmbeddedResourceExtractor.GetFile("SomeFile2.ext"); 
    } 
+3

http://stackoverflow.com/questions/263151/lambdas-and-the-ternary-operator-weird-issue – user17541

उत्तर

41

सशर्त अभिव्यक्ति के प्रकार है एक के रूप में अनुमान लगाया जा करने के लिए पूरे - और लैम्ब्डा अभिव्यक्तियों को हमेशा एक विशिष्ट प्रतिनिधि या अभिव्यक्ति वृक्ष प्रकार में परिवर्तित करना होता है।

आपके बाद के दो उदाहरणों में, संकलक जानता है कि यह लैम्ब्डा अभिव्यक्ति को परिवर्तित करने का प्रयास कर रहा है। पहले उदाहरण में, यह पहले पूरी सशर्त अभिव्यक्ति के प्रकार को काम करने की कोशिश करता है।

शाखाओं में से एक में एक कलाकार हालांकि पर्याप्त होगा:

protected override Func<Stream> GetStream() 
{ 
    return someBool 
     ? (Func<Stream>) 
      (() => EmbeddedResourceExtractor.GetFile("SomeFile1.ext")) 
     :() => EmbeddedResourceExtractor.GetFile("SomeFile2.ext"); 
} 

सर्जियो के ठीक (अब नष्ट कर दिया है, लेकिन नीचे शामिल) काम करेंगे अगर आप समय समारोह है पर someBool मूल्यांकन करने के लिए खुश थे कहा जाता है:

protected override Func<Stream> GetStream() 
{ 
    return() => someBool 
      ? EmbeddedResourceExtractor.GetFile("SomeFile1.ext") 
      : EmbeddedResourceExtractor.GetFile("SomeFile2.ext"); 
} 

समय पर निर्भर करते हैं, वहाँ है, जैसे उदाहरण आप वास्तव में दे दिया है फिक्सिंग के विभिन्न तरीकों के सभी प्रकार हैं

protected override Func<Stream> GetStream() 
{ 
    string name = someBool ? "SomeFile1.ext" : "SomeFile2.ext"; 
    return() => EmbeddedResourceExtractor.GetFile(name); 
} 

मुझे लगता है कि आपका असली कोड अधिक जटिल है।

कुछ तरीकों से यह शर्म की बात है कि सी # का प्रकार अनुमान अधिक शक्तिशाली नहीं हो सकता है - लेकिन यह पहले से ही जटिल है।

+2

ब्रांड्स में पहली शाखा को लपेटने के अपवाद के साथ, यह हाँ काम करता है ... आशा है कि वे सी # के प्रकार की अनुमान भविष्य में भी बेहतर बना सकता है। हालांकि, यह पहले से ही बहुत अच्छा है =) – Svish

+0

अच्छा विकल्प, वास्तव में उनमें से किसी के बारे में सोचा नहीं था। लेकिन वे इसे स्पष्ट हां बना देंगे :) – Svish

+0

क्या आपको लगता है कि यह ऐसा कुछ है जिसे वे कभी भी सुधारेंगे? यह मुद्दा (और इसके समान अन्य - जैसे कि ** var ** lambdas के साथ उपयोग करने में सक्षम नहीं है) वास्तव में शर्म की बात है। –

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