作者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/cn.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