【发布时间】:2018-07-23 08:57:52
【问题描述】:
我有两个函数,一个可以编译,一个不能。有什么区别?
函数号 1 是否假定案例 1 总是会被命中,或者它只是一个编译器问题?
public void Test(int x)
{
switch (x)
{
case 1:
uint cId = (uint)3;
break;
case 2:
cId = (uint)5; //NO ERROR HERE. WHY?
break;
}
}
public void DeclaringInsideSwitch(int x)
{
uint tst = 0;
switch (x)
{
case 1:
int y = 3;
uint variable = tst;
break;
case 2:
variable++; //ERROR HERE. WHY?
break;
}
}
我当然尝试搜索“在 C# 中的 switch case 中声明变量”,但对我来说,现在这似乎是 C# 中的某种错误,为了向后兼容而保留。
// 在收到已回答的警告后,我的问题现在可以简化为真正的问题。
为什么:
int x;
x++;
这不行吗?
【问题讨论】:
-
所以不同之处在于您只是在第一个代码中为变量赋值,但在第二个代码中您实际上尝试使用它(由于尚未初始化而失败)
-
variable++首先读取变量,然后写入一个比读取到的变量大一的新值。但是对于局部变量(即在方法/访问器/等中声明的变量),如果编译器无法证明该变量已被设置,则不允许您读取。在您的最后一个示例中,这是允许的:case 2: variable = 100; variable++; break; -
我的问题非常接近“C# switch 语句中的变量声明”,但是你应该看到那个变量++,甚至编译失败!这让我很困惑
-
您是否阅读了错误信息?这应该会给你一个大量线索出了什么问题。
-
作为解决此类问题的一般答案:不断缩小两段代码之间的差异,直到达到无法再更改任何内容而不破坏不同行为的地步。在这种情况下,您会发现分配给本地人与从本地人读取不同。除非您已经知道编译器如何翻译两个完整的代码块,否则您的两个示例差异太大,无法得出任何结论。我们要求重现问题的最短代码是有原因的 :)
标签: c# .net switch-statement