आम तौर पर, सशर्त ऑपरेटर का उपयोग करते समय, यहां वाक्यविन्यास है:मैं सशर्त टर्नरी ऑपरेटर का उपयोग करके लैम्बडा के बीच सशर्त रूप से एक Func <> कैसे असाइन कर सकता हूं?
int x = 6;
int y = x == 6 ? 5 : 9;
कुछ भी फैंसी, बहुत सीधे आगे नहीं।
अब, चलिए एक Func प्रकार को Lambda असाइन करते समय इसका उपयोग करने का प्रयास करें। मुझे समझाएं:
Func<Order, bool> predicate = id == null
? p => p.EmployeeID == null
: p => p.EmployeeID == id;
यह वही वाक्यविन्यास है, और काम करना चाहिए? सही? किसी कारण से ऐसा नहीं करता है। कंपाइलर यह अच्छा गुप्त संदेश देता है:
त्रुटि 1 सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है क्योंकि 'लैम्ब्डा अभिव्यक्ति' और 'लैम्ब्डा अभिव्यक्ति'
के बीच कोई अंतर्निहित रूपांतरण नहीं है, फिर मैं आगे बढ़ गया और वाक्यविन्यास बदल दिया और इस तरह यह काम किया:
Func<Order, bool> predicate = id == null
? predicate = p => p.EmployeeID == null
: predicate = p => p.EmployeeID == id;
मैं सिर्फ उत्सुक हूं कि यह पहली बार क्यों काम नहीं करता है?
(साइड नोट: मुझे इस कोड की आवश्यकता नहीं है, क्योंकि मुझे पता चला है कि शून्य के विरुद्ध एक इंट मान की तुलना करते समय, आप ऑब्जेक्ट का उपयोग करते हैं। एक्वाल्स)
मुझे आश्चर्य है कि, अगर संकलक इस अनुमान लगा सकते हैं: 'समारोह विधेय = पी => p.EmployeeID == id', कैसे यह मुसीबत यह निष्कर्ष निकालते हैं:' समारोह विधेय = आईडी == बातिल ? (Func ) (p => p.EmployeeID == null) : p => p.EmployeeID == id; '? मेरा मतलब है कि यह 'predicate' की घोषणा के माध्यम से दूसरे और तीसरे ऑपरेटरों के लिए आवश्यक प्रकार जानता है। –
GDS
@ जीडीएस: लैम्ब्डा अभिव्यक्ति से प्रतिनिधि प्रकार में एक निहित रूपांतरण है, यही कारण है कि पहला संस्करण काम करता है। लेकिन 'predicate' की घोषणा सशर्त अभिव्यक्ति के लिए प्रकार अनुमान को प्रभावित नहीं करती है। भाषा विनिर्देश मूल रूप से कहता है कि सशर्त अभिव्यक्ति का प्रकार केवल ऑपरेटरों के माध्यम से अवरुद्ध होना चाहिए। –
तब मुझे आश्चर्य है, टर्नरी ऑपरेटर की इतनी आवश्यकता क्यों होगी। यह एक चर या एक अभिव्यक्ति के सशर्त मूल्यांकन के लिए दूसरे या तीसरे ऑपरेंड का एक सशर्त असाइनमेंट है। जब तक मुझे कुछ याद नहीं आ रहा है, प्रत्यक्ष कार्य या मूल्यांकन के साथ प्राप्त कोई अनुमान सशर्त असाइनमेंट या मूल्यांकन के साथ भी व्यावहारिक होना चाहिए। इसके अलावा यदि एक ऑपरेटर संदिग्ध है, तो दूसरे की धारणा संभावित रूप से अस्पष्टता को हल कर सकती है। अगर अस्पष्टता को हल नहीं किया जा सकता है तो संकलक अभी भी शिकायत कर सकता है क्योंकि यह उपर्युक्त उदाहरण में करता है। शायद एक छोड़ी गई सुविधा ...? – GDS