3

为什么必须在 if 语句的范围之外声明变量才能存在?

例如,以下代码无法编译:

DateTime? myDate;
if (myDate != null)
{
    DateTime runDate = DateTime.Now;
}
else
{
    DateTime runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.toString();

我理解问题是我需要runDate在 if 语句之前声明,但是为什么呢?如果编译器确实允许这段代码工作,它真的与之前声明它有什么不同吗?或者更好的说法是,为什么从事语言/框架工作的开发人员决定这样做?

4

7 回答 7

15

好吧,考虑一下,源自您的示例:

DateTime? myDate;
if (myDate != null)
{
    String runDate = DateTime.Now.ToString();
}
else
{
    DateTime runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.ToString();

根据您的建议,runDate(何时foo分配)的类型在编译时是未知的,它可以是 astring或 a DateTime。这在静态类型语言中是不允许的。

于 2013-07-26T19:46:15.120 回答
3

变量不存在于它声明的范围之外。

在您的情况下,变量 runDate 是在您的 if 语句中创建的,因此它不能在外部使用。

这将被允许

DateTime? myDate;
DateTime runDate;
if (myDate != null)
{
     runDate = DateTime.Now;
}
else
{
    runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.toString();
于 2013-07-26T19:45:36.090 回答
1

正如其他人所说 - 它是 C# 中本地定义的一部分:

http://blogs.msdn.com/b/ericlippert/archive/2012/01/16/what-is-the-defining-characteristic-of-a-local-variable.aspx

于 2013-07-26T19:47:34.467 回答
0

即使在编译器DateTime runDate的两侧都声明了这if一点,除非运行深度分析以确保编译器不在那里执行,否则不知道这一点。此外,在if方法范围内if声明就是在方法的范围内声明,如果你想在方法内使用某些东西,你需要在方法的范围内声明它,并在if.

DateTime? myDate ;
DateTime runDate ;

if (myDate != null)
{
    runDate = DateTime.Now;
}
else
{
    runDate = DateTime.Now.AddDays(1);
}

string foo = runDate.toString();
于 2013-07-26T19:44:44.850 回答
0

因为 C# 中的变量仅在其块内有效。尝试在 if 语句中创建 runDate 变量没有任何问题。失败的原因是尝试在其块之外使用 runDate 变量。

声明必须在使用它的最外层块上。您当然可以将 runDate.ToString() 移动到 if 语句中,如果您愿意,它会编译。

于 2013-07-26T19:45:34.250 回答
0

因为块作用域。编译器更容易解决,而且更合乎逻辑。每个块(一组左括号和右括号)都有其局部变量,这些变量仅在其内部范围内,以及任何子块。这是有道理的,可以阻止人们发疯。

于 2013-07-26T19:47:07.853 回答
0

想象一下,您有以下内容:

if (something)
{
    string foo = "Abc";
}
else if (somethingelse)
{
    DateTime foo = DateTime.Now;
}
else
{
    //Do nothing
}
Some.Method(foo); //What type is foo, string or DateTime? Does it even exist?

如您所见,如果您允许在 if/else 块范围内声明的变量在这些块之外使用,则这些声明可能会相互冲突(甚至在某些“if 分支”中丢失)。因此,该语言的设计者决定不允许这样做。(此外,一般来说,在块内声明的 C# 中的变量仅在该块内可用。仅针对 if 语句更改此变量会很奇怪且不一致。)您仍然可以在 if 块内声明变量,只是不能使用这些外变量。

于 2013-07-26T19:50:46.113 回答