ทำไมคอมไพเลอร์ C # อนุญาตให้มีตัวแปรที่ซ้ำกันในขอบเขตซ้อนกัน?


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

ทำไมเรื่องนี้ถึงได้รับอนุญาตทันที?

คำถามติดตาม:หากนี่เป็น "คุณสมบัติ" ภาษาใหม่มีวิธีการกำหนดค่า Visual Studio เพื่อดำเนินการต่อเพื่อหยุดพักเมื่อตัวแปรถูกทำซ้ำในขอบเขตที่ซ้อนกันหรือไม่


2
ฉันไม่คิดว่าจะอนุญาตให้มีตัวแปรซ้ำกัน มันใช้testตัวแปรเดียวกันเนื่องจากชนิดข้อมูลเหมือนกัน ลองประกาศtestตัวแปรint เช่น var test = 12345;ฉันคิดว่าคุณควรได้รับข้อผิดพลาดในการรวบรวม (ฉันยังไม่ได้ลอง)
LP13

1
@ LP13 การเปลี่ยนประเภทของtestที่แนะนำไม่มีผลใด ๆ คุณสามารถลองได้ในซอที่เชื่อมโยงกับคำถาม
Amy

1
ไม่เป็นไรกรอบเป้าหมายไม่เกี่ยวข้อง พฤติกรรมใหม่เกิดจากรุ่นภาษา รหัสรวบรวมใน C # 8 มันไม่ได้รวบรวมใน C # 7.3 (และฉันถือว่าต่ำกว่า)
Emanuel Vintilă


6
มีปัญหา GitHub สำหรับสิ่งนั้น เหตุการณ์สำคัญตั้งเป็น 16.5 @OrkhanAlikhanov คุณได้พบมันเร็วขึ้น :)
Pavel Anikhouski

คำตอบ:



0

ฉันเดาว่าฟังก์ชั่นที่เลือกจะถูกรวบรวมเป็นแบบคงที่เพราะมันไม่มีการเชื่อมต่อกับร่างกายวิธีการโฮสต์ มันแค่พิมพ์และส่งคืนสินค้าที่เป็นปัญหา สิ่งนี้ไม่ต้องการการเข้าถึงวิธีการใด ๆ และด้วยเหตุผลดังกล่าวสามารถย้ายเหตุผลการปรับให้เหมาะสมออกจากเนื้อหาวิธีการและวางด้วยตนเองภายในขอบเขตทั่วโลก

และในกรณีนี้ตัวแปรทดสอบนั้นเป็นตัวแปรของตัวเองและไม่มีการเชื่อมต่อกับตัวแปรทดสอบข้างต้น

สำหรับการป้องกันสิ่งนี้คุณไม่สามารถบอกให้ vs เกิดข้อผิดพลาดเมื่อมันเกิดขึ้นคุณจะเปลี่ยนชื่อตัวแปรด้วยตนเอง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.