以下代码无法编译声明"在此范围内无法声明名为'st'的局部变量,因为它会给'st'赋予不同的含义,'st'已在'子'范围内用于表示其他内容":
var l = new List<string>();
l.Find(st => st.EndsWith("12"));
string st = "why this fails?";
Run Code Online (Sandbox Code Playgroud)
我理解为什么这不起作用:
string preParent = "";
{
string preParent = "Should fail cause we change the meaning";
}
Run Code Online (Sandbox Code Playgroud)
当我们执行以下操作时,我们得到"CS0103:当前上下文中不存在名称'postParent'":
{
string postParent=string.Empty;
}
postParent = "Should this work?";
Run Code Online (Sandbox Code Playgroud)
我没有得到的是为什么编译器足够聪明,看到postParent不在范围内,但是不允许我定义一个与子范围内使用的变量同名的新变量(显然是此时的范围).
编译器是否通过拒绝让我使用变量来简单地强制执行范围?如果是这样这是有道理的.
===========
编辑:
我想我也觉得有趣的是你如何在一个方法中的两个子范围内拥有相同的变量,所以这是有效的:
{
string thisWorks= string.Empty;
}
{
string thisWorks= "Should this work?";
}
Run Code Online (Sandbox Code Playgroud)
我只是有点好奇,你可以有两个同名的变量,只要它们处于同一级别(如果你将范围视为树).这是有道理的,因为您可以在具有相同名称的同一类的两个方法中具有局部变量.
我很惊讶编译器能够区分并允许它,而它不允许postParent变量.这是技术限制还是设计决策?这就是我真正想要的;-)
for (int i = 0; i < 10; i++)
{
Foo();
}
int i = 10; // error, 'i' already exists
----------------------------------------
for (int i = 0; i < 10; i++)
{
Foo();
}
i = 10; // error, 'i' doesn't exist
Run Code Online (Sandbox Code Playgroud)
根据我对范围的理解,第一个例子应该没问题.它们都不允许的事实似乎更奇怪.肯定'我'要么在范围内,要么不在范围内.
有什么不明显的范围我不明白这意味着编译器真的无法解决这个问题?或者只是一个保姆状态编译案例?
我有以下代码
using(some code)
{
var b = ....
}
var b = ...
Run Code Online (Sandbox Code Playgroud)
Erorr: 名为'b'的局部变量不能在此范围内声明,因为它会给'b'赋予不同的含义,'b'已在'child'范围内用于表示其他内容
好的,编辑
using(some code)
{
var b = ....
}
b = ...
Run Code Online (Sandbox Code Playgroud)
Error: 当前上下文中不存在名称"b"
不确定这是否是因为 C# 编译器非常挑剔,但我尝试在 C# 中执行此操作:
public static void Main()
{
bool result = true; // some dummy value
if(result)
{
int x = 5;
Console.WriteLine(x);
}
int x = 10;
Console.WriteLine(x);
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨变量名“x”已被使用:
不能在此作用域中声明名为“x”的局部变量,因为它会给“x”赋予不同的含义,而“x”已在“子”作用域中用于表示其他内容。
我知道它认为这是一个范围问题,但为什么它会这么认为呢?
如果我用 Java 重现相同的代码,就没有问题。