सी # कंपाइलर नेस्टेड स्कोप में डुप्लिकेटेड वैरिएबल की अनुमति क्यों देता है?


18

ऐतिहासिक रूप से, .Net में विकास करते समय, मैं नेस्टेड स्कोप में वैरिएबल के नाम की नकल नहीं कर सकता था । हालाँकि, हाल ही में Visual Studio 2019 को संस्करण 16.4.2 में अपडेट करने के बाद, मैंने देखा है कि चर नामों को नेस्टेड स्कोप में दोहराया जा सकता है।

उदाहरण के लिए:

var test = "hello";
Console.WriteLine(test);
var things = new []{"one", "two", "three"};
things.Select(test => // <- test is duplicated here, normally this breaks compilation
{
    Console.WriteLine(test);
    return test;
}).ToList();

// output:
// hello
// one
// two
// three

https://dotnetfiddle.net/h85BK4

यह अचानक क्यों अनुमति है?

अनुवर्ती प्रश्न: यदि यह एक नई भाषा "फीचर" है, तो क्या नेस्टेड स्कोप को नेस्टेड स्कोप में डुप्लिकेट होने पर तोड़ने के लिए विजुअल स्टूडियो को कॉन्फ़िगर करने का एक तरीका है?


2
मुझे नहीं लगता कि इसकी अनुमति डुप्लिकेट चर है। testडेटा प्रकार के एक ही चर का उपयोग करते हुए इसकी एक ही है। testचर को int उदाहरण के रूप में घोषित करने का प्रयास करें । var test = 12345;मुझे लगता है कि आपको संकलित त्रुटि मिलनी चाहिए। (मैंने इसे आजमाया नहीं है)
LP13

1
@ LP13 सुझाए गए प्रकार को बदलने से testकोई प्रभाव नहीं पड़ता है। आप इसे प्रश्न में जुड़े फ़िडल में आज़मा सकते हैं।
एमी

1
कोई बात नहीं, लक्ष्य रूपरेखा अप्रासंगिक है। नया व्यवहार भाषा संस्करण के कारण है। कोड C # 8 पर संकलित है, यह C # 7.3 (और नीचे दिए गए मान) पर संकलित नहीं करता है
Emanuel Vintilă


6
उसके लिए GitHub मुद्दा है। माइलस्टोन 16.5 पर सेट है। @OrhanAlikhanov आपने इसे बहुत जल्दी पाया है :)
पावेल अनिखुस्की

जवाबों:


1

यह C # 8.0 में एक नई विशेषता है, स्थानीय फ़ंक्शन और लैम्ब्डा पैरामीटर बाहरी नामों को छाया कर सकते हैं।


0

मेरा अनुमान है कि चयनित फ़ंक्शन को स्थिर के रूप में संकलित किया जा रहा है क्योंकि इसका मेजबान विधि निकाय से कोई संबंध नहीं है। यह सिर्फ प्रिंट करता है और प्रश्न में आइटम को लौटाता है। इसके लिए विधि तक किसी भी पहुंच की आवश्यकता नहीं है और इस तरह, यह अनुकूलन कारणों से विधि निकाय से बाहर ले जाया जा सकता है और वैश्विक दायरे में अपने दम पर रखा जा सकता है।

और इस मामले में, यह परीक्षण चर का अपना चर है और उपरोक्त परीक्षण चर का कोई संबंध नहीं है।

इसे रोकने के लिए, आप बनाम नहीं बता सकते हैं कि जब यह होता है, तो आप एक त्रुटि फेंक सकते हैं, आपको बस मैन्युअल रूप से चर नाम बदलना होगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.