कारण निम्नलिखित है:
जिस तरह से आप प्रतिनिधि को घोषित करते हैं वह सीधे 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
।