निम्नलिखित अभिव्यक्ति पर विचार करें:"यह" के लिए ह्युरिस्टिक और बंद हो जाता है ठीक है? (अभिव्यक्ति पेड़)
class A {
int x;
public void Method(int y) {
Expression<Func<bool>> expr=() => x == y;
//...
यहां, अभिव्यक्ति में y
के लिए स्वचालित रूप से निर्मित बंद होना शामिल है, और this
के A
के संदर्भ (implicit) this.x
के लिए संदर्भ शामिल है। अभिव्यक्ति वृक्ष में ConstantExpression
पर दोनों को MemberExpression
के रूप में दर्शाया जाएगा। इस संदर्भ और/या बंद होने के साथ expr
या अधिक जटिल अभिव्यक्ति जैसे अभिव्यक्ति को देखते हुए, मैं यह जानना चाहता हूं कि एक विशेष ConstantExpression
वास्तव में "यह" है या एक अंतर्निहित रूप से निर्मित बंद अभिव्यक्ति वृक्ष से C# को पुन: उत्पन्न करने में सक्षम है (ExpressionToCode)।
मैंने कुछ ह्युरिस्टिक्स का उपयोग करके "समाधान" बनाया है क्योंकि ऐसा कोई सही समाधान प्रतीत नहीं होता है।
- लैम्ब्डा में क्लोजर और
this
हमेशाConstantExpressions
में होते हैं। - क्लोजर और
this
कभीnull
नहीं हैं। - दोनों वर्ग हैं, मूल्य प्रकार नहीं - आप एक संरचना से
this
के संदर्भ को कैप्चर नहीं कर सकते हैं। यह बहुत भाग्यशाली है, क्योंकिthis.Method()
सेdefault(StructType).Method()
को अन्यथा असंभव हो जाएगा जब भीthis == default(StructType)
। - बिल्टिन प्रकार (स्ट्रिंग, एनम्स, दशमलव, टाइप, सभी प्राइमेटिव्स) वास्तव में वास्तविक स्थिरांक हैं,
this
नहीं या एक बंद - क्लोजर और बेनामी प्रकार
<
से शुरू होते हैं औरCompilerGeneratedAttribute
- के साथ एनोटेट किए जाते हैं क्लोजर नामों में शामिल होते हैं स्ट्रिंग
DisplayClass
, अज्ञात प्रकारों मेंAnonymousType
- अज्ञात प्रकार सामान्य हैं, बंद नहीं हैं।
- क्लोजर नेस्टेड कक्षाएं हैं, अनाम प्रकार नहीं हैं।
- के साथ एनोटेट किए जाते हैं क्लोजर नामों में शामिल होते हैं स्ट्रिंग
this
एक सामान्य प्रकार होना चाहिए:CompilerGenerated
नहीं और<
से शुरू नहीं होता है उपरोक्त हेरिस्टिक, वास्तविक स्थिरांक, this
, बंद और अज्ञात प्रकारों के बीच अंतर करने के लिए पर्याप्त हैं? अर्थात। क्या ऐसे मामले हैं जहां ये हेरिस्टिक विफल हो जाते हैं, या क्या मुझे कोई याद आ रहा है? क्या भविष्य में .NET संस्करणों में तोड़ने की संभावना है?
संपादित करें: मैंने पहली बार इस प्रश्न को बिना किसी परिणाम के एक खुले अंत में फैशन में पूछा; मैं अब तक जो कुछ आया हूं उसे शामिल करने के लिए प्रश्न को फिर से लिखता हूं। किसी भी सुझाव की बहुत सराहना की - बक्षीस की कल समाप्त हो रही है, किसी भी विचार का स्वागत है ...
क्या आप सुनिश्चित हैं कि आपकी धारणा सही है? मेरी राय में (मैं एक विशेषज्ञ नहीं हूं;)), एक्स अभिव्यक्ति में एक्स ए के किसी भी ज्ञान के बिना एक int के लिए 'संदर्भ' हो सकता है (और अभिव्यक्ति से ए के बारे में कोई रास्ता नहीं ढूंढने के लिए) – Guillaume86
ठीक है मैं गलत हूं अभिव्यक्ति पेड़ों के साथ यह संभव है (और यह स्पष्ट है ^^) – Guillaume86
मुझे यकीन है कि एक उत्तर के करीब होना संभव है। मुझे यकीन नहीं है कि यह संभव है - मैंने इस मामले पर अपने वर्तमान विचार जोड़े हैं, जो कि आपको कंपाइलर जेनरेट प्रकार, वास्तविक स्थिरांक और उपयोगकर्ता प्रकारों के बीच पता लगाने और अंतर करने की आवश्यकता होगी - और ध्यान दें कि कंपाइलर भी अनाम उत्पन्न करता है प्रकार जो बंद होने के लिए नहीं हैं। –