C#語言規範規定,對於表達式中一個簡單命名的標識符,在同一個即刻閉合控制塊內或者switch塊內(the immediately enclosing block or switch-block)的語義是恆定不變的。這條規則確保了在一個表達式的上下文的環境中,同一個名字在一個控制塊內擁有相同的含義。否則會引發編譯錯誤,如下:
class Test
{
double x;
void F(bool b) {
x = 1.0; //外圍控制塊
if (b) {
int x; //嵌套控制塊是屬於外圍控制塊, 同一個即刻閉合控制塊
x = 1;
}
}
}
但是下面的就不會引發編譯錯誤:
class Test
{
double x;
void F(bool b) {
if (b) {
x = 1.0;//指向Test.x,
}
else {
int x;//覆蓋了Test.x,
x = 1;
}
}
}
這些編譯錯誤在C++是不會發生的。