เหตุผลที่คุณไม่ได้รับอนุญาตให้กำหนดตัวแปรที่มีชื่อเดียวกันทั้งใน for-loop และภายนอก for-loop เนื่องจากตัวแปรในขอบเขตภายนอกนั้นใช้ได้ในขอบเขตภายใน หมายความว่าจะมีตัวแปร 'i' สองตัวอยู่ใน for-loop หากได้รับอนุญาต
ดู: ขอบเขต MSDN
โดยเฉพาะ:
ขอบเขตของตัวแปรโลคัลที่ประกาศในการประกาศตัวแปรโลคัล (ส่วนที่ 8.5.1) คือบล็อกที่การประกาศเกิดขึ้น
และ
ขอบเขตของตัวแปรโลคัลที่ประกาศใน for-initializer ของคำสั่ง for (ส่วน 8.8.3) คือ for-initializer, for-condition, for-iterator และคำสั่งที่มีอยู่ของคำสั่ง for
และ: การประกาศตัวแปรท้องถิ่น (ส่วนที่ 8.5.1 ของข้อกำหนด C #)
โดยเฉพาะ:
ขอบเขตของตัวแปรโลคัลที่ประกาศในการประกาศตัวแปรภายในคือบล็อกที่การประกาศเกิดขึ้น เป็นข้อผิดพลาดในการอ้างถึงตัวแปรโลคัลในตำแหน่งข้อความที่นำหน้า local-variable-declarator ของตัวแปรโลคัล ภายในขอบเขตของตัวแปรโลคัลเป็นข้อผิดพลาดเวลาคอมไพล์เพื่อประกาศตัวแปรโลคัลหรือค่าคงที่อื่นที่มีชื่อเดียวกัน
(เน้นของฉัน)
ซึ่งหมายความว่าขอบเขตของi
ภายใน for-loop ของคุณคือ for-loop ในขณะที่ขอบเขตของi
ด้านนอกของ for-loop ของคุณคือวิธีการหลักทั้งหมดบวกกับ for-loop หมายความว่าคุณมีเหตุการณ์ที่เกิดขึ้นสองครั้งi
ในลูปซึ่งไม่ถูกต้องตามที่กล่าวไว้ข้างต้น
สาเหตุที่คุณไม่ได้รับอนุญาตให้ทำint A = i;
เนื่องจากint i
มีการกำหนดขอบเขตให้ใช้ภายในfor
ลูปเท่านั้น ดังนั้นจึงไม่สามารถเข้าถึงได้จากภายนอกfor
ลูปอีกต่อไป
ดังที่คุณเห็นปัญหาทั้งสองนี้เป็นผลมาจากการกำหนดขอบเขต ปัญหาแรก ( int i = 4;
) จะส่งผลให้เกิดi
ตัวแปรสองตัวภายในfor
ขอบเขตการวนซ้ำ ในขณะที่int A = i;
จะส่งผลให้เข้าถึงตัวแปรที่อยู่นอกขอบเขต
สิ่งที่คุณสามารถทำได้คือประกาศว่าi
จะกำหนดขอบเขตให้กับวิธีการทั้งหมดจากนั้นใช้ทั้งในวิธีการและขอบเขต for-loop วิธีนี้จะหลีกเลี่ยงการละเมิดกฎข้อใดข้อหนึ่ง
public static void Main()
{
int i;
for (i = 0; i < 5; i++)
{
}
i = 4;
int A = i;
}
แก้ไข :
แน่นอนว่าคอมไพเลอร์ C # สามารถเปลี่ยนแปลงได้เพื่อให้โค้ดนี้คอมไพล์ถูกต้อง หลังจากทั้งหมดนี้ถูกต้อง:
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
แต่มันจะเป็นประโยชน์ต่อความสามารถในการอ่านโค้ดและความสามารถในการบำรุงรักษาของคุณหรือไม่ที่จะสามารถเขียนโค้ดเช่น:
public static void Main()
{
int i = 4;
for (int i = 0; i < 5; i++)
{
Console.WriteLine(i);
}
for (int i = 5; i > 0; i--)
{
Console.WriteLine(i);
}
Console.WriteLine(i);
}
ลองคิดดูว่าอาจเกิดข้อผิดพลาดได้ที่นี่ครั้งล่าสุดi
พิมพ์ 0 หรือ 4 หรือไม่? ตอนนี้เป็นตัวอย่างเล็ก ๆ ซึ่งค่อนข้างง่ายต่อการติดตาม แต่แน่นอนว่าสามารถบำรุงรักษาและอ่านได้น้อยกว่าการประกาศด้านนอกi
ด้วยชื่ออื่น
หมายเหตุ:
โปรดทราบ, C # 's กฎกำหนดขอบเขตแตกต่างจากC ++ กฎระเบียบกำหนดขอบเขต ในตัวแปร C ++ จะอยู่ในขอบเขตจากตำแหน่งที่ประกาศไปจนถึงจุดสิ้นสุดของบล็อกเท่านั้น ซึ่งจะทำให้โค้ดของคุณเป็นโครงสร้างที่ถูกต้องใน C ++