कारण निम्नलिखित है:
जिस तरह से आप प्रतिनिधि को घोषित करते हैं वह सीधे ToStringस्थिर अंतर की विधि की ओर इशारा करता है। यह निर्माण के समय पर कब्जा कर लिया है।
जैसा कि फ्लिंडबर्ग नीचे टिप्पणी में बताते हैं, प्रत्येक प्रतिनिधि के पास एक लक्ष्य होता है और लक्ष्य पर निष्पादित होने के लिए एक विधि होती है।
इस मामले में, निष्पादित की जाने वाली ToStringविधि स्पष्ट रूप से विधि है। दिलचस्प हिस्सा वह उदाहरण है जिस पद्धति को निष्पादित किया गया है: यह Iनिर्माण के समय का उदाहरण है , जिसका अर्थ है कि प्रतिनिधि उपयोग Iकरने के लिए इंस्टेंस प्राप्त करने के लिए उपयोग नहीं कर रहा है, लेकिन यह उदाहरण के लिए संदर्भ को संग्रहीत करता है।
बाद में आप Iएक अलग मूल्य में बदल जाते हैं, मूल रूप से इसे एक नया उदाहरण प्रदान करते हैं। यह जादुई रूप से आपके प्रतिनिधि में कैप्चर किए गए उदाहरण को नहीं बदलता है, ऐसा क्यों होना चाहिए?
अपेक्षित परिणाम प्राप्त करने के लिए, आपको प्रतिनिधि को इसे बदलना होगा:
static Func<string> del = new Func<string>(() => I.ToString());
इस तरह, प्रतिनिधि एक अनाम विधि की ओर इशारा करता है जो प्रतिनिधि के निष्पादन के समय ToStringकरंट Iपर निष्पादित होता है ।
इस मामले में, निष्पादित की जाने वाली विधि एक अनाम विधि है जिसे कक्षा में बनाया गया है जिसमें प्रतिनिधि को घोषित किया गया है। उदाहरण शून्य है क्योंकि यह एक स्थिर विधि है।
उस कोड पर एक नज़र डालें जो कंपाइलर प्रतिनिधि के दूसरे संस्करण के लिए बनाता है:
private static Func<string> del = new Func<string>(UserQuery.<.cctor>b__0);
private static string cctor>b__0()
{
return UserQuery.I.ToString();
}
जैसा कि आप देख सकते हैं, यह एक सामान्य तरीका है जो कुछ करता है । हमारे मामले में यह ToStringवर्तमान उदाहरण पर कॉल करने का परिणाम देता है I।