作者mingpepe ()
看板C_Sharp
標題[問題] 變數範圍
時間Sun May 17 22:37:02 2015
用的是 C# 5.0, .NetFramework 4.5, Visual Studio 2013
//-----------------------
for(int i=0;i<10;i++){}
int i;
//-----------------------
編譯錯誤訊息:無法在此範圍宣告名為 'i'的變數,因為其可能賦予 'i'不同的意義
為什麼呢?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.26.239.34
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1431873425.A.84E.html
1F:→ yuhaw0715: 因為i被宣告兩次,而且這樣會造成無限迴圈的說... 05/17 22:45
2F:→ mingpepe: for後面有大括號 05/17 22:47
3F:→ wenyonba: 因為並不是你 int i; 在 for 後面,就代表外面的 i 僅限 05/17 22:47
4F:→ wenyonba: 於 for 之後~~ 05/17 22:48
5F:→ mingpepe: 怎麼我不太理解樓上的說法? 05/17 22:50
6F:→ GoalBased: 為什麼你會覺得可以? 05/17 23:10
7F:→ mingpepe: 變數i在離開for迴圈後就會消失,為什麼會無法在宣告一個 05/17 23:26
8F:→ mingpepe: 變數i? 至少這在C++是可以的 05/17 23:26
9F:→ GoalBased: 可是你寫的是C#阿..可以參考C# 語言規格第三章 05/17 23:36
10F:→ GoalBased: 至於說為什麼喔,應該只是比較嚴謹吧 05/17 23:38
11F:→ mingpepe: 是的 我當然了解這是C#不是C++ 我好奇的是理由 05/17 23:42
12F:→ mingpepe: 不同的語言有不同的語法 也會帶來不同的好處與壞處 05/17 23:42
13F:→ GoalBased: 哦..規定阿 05/17 23:43
14F:→ mingpepe: 既然在for迴圈外無法存取變數i 有什麼樣的理由會限制 05/17 23:43
15F:→ mingpepe: 不能再次宣告同名的變數 05/17 23:44
17F:→ GoalBased: harp/13369.html 參考一下別人的回答 05/17 23:46
18F:→ GoalBased: PTT不讓我貼縮網址了= = 自己複製一下吧 05/17 23:46
19F:→ GoalBased: 他那一段也是語言規格裡面截出來的 05/17 23:49
20F:→ GoalBased: 我最近剛好也在看這個東西,如果你對這種東西有興趣的 05/17 23:49
21F:→ GoalBased: Program Files (x86)\Microsoft Visual Studio 12.0\VC 05/17 23:49
22F:→ GoalBased: VC#\Specifications 底下有語言規格的word黨可以看 05/17 23:50
23F:→ GoalBased: 如果要再深入一點我也沒辦法回答了 05/17 23:57
24F:→ GoalBased: 可以考慮上MSDN問看看 05/17 23:57
C#5.0 Spec 7.6.2.1 有提到
例如
class Test
{
double x;
void F(bool b) {
x = 1.0;
if(b) {
int x;
x = 1;
}
}
}
會產生編譯時期錯誤
而
clss Test
{
double x;
void F(bool b) {
if(b) {
x = 1.0;
}
else {
int x;
x = 1;
}
}
}
就不會產生錯誤
Spec上的說明看不是很懂
※ 編輯: mingpepe (114.26.239.34), 05/18/2015 00:10:57
25F:→ GoalBased: spec有說,會錯是因為第一個有 x = 1.0; 05/18 09:17
26F:→ GoalBased: 他有寫解釋啦,不過我也不知道"到底"是為什麼 05/18 09:17
27F:→ TobyH4cker: 我才跟IL的特性有關 05/18 11:13
28F:→ TobyH4cker: 猜 05/18 11:13
29F:→ TobyH4cker: 我回家試試看 05/18 11:15
30F:→ TobyH4cker: 原來下篇有人提到了 05/18 11:17