为什么 if 语句中的此字符串初始化会阻止我打印?

Why does this string initialization in an if statement prevent me from printing?

提问人:madman 提问时间:2/25/2009 最后编辑:Jamesmadman 更新时间:8/11/2011 访问量:454

问:

我没什么问题

{
    string nom;
    string ou;
    nom = "1";
    if (nom == "1")
    {
        nom +=1;
        ou = nom;
    }
    Console.Write(ou);
}

但是我无法打印 ou 值,我不知道为什么

C# 语法 language-design if-statement

评论

1赞 dbkk 6/23/2009
在我看来,这不是一个明确的问题。代码很奇怪,没有解释——为什么字符串上有“x += 1”?

答:

7赞 Mehrdad Afshari 2/25/2009 #1

C# 编译器要求在使用前明确初始化变量。

确定初始化是编译时的事情,它不考虑变量的运行时值。

但是,如果将变量显式定义为 ,编译器将确保它在运行时不会更改,并且语句块将运行,并且该变量肯定会被分配给。nomconstifou

11赞 Jedi Master Spooky 2/25/2009 #2

试试这样的东西

{
    string nom;
    string ou = String.Empty;
    nom = "1";
    if (nom == "1")
    {
        nom +=1;
        ou = nom;
    }
    Console.Write(ou);
}
3赞 Adam Ralph 2/25/2009 #3

这是因为 ou 未赋值在 if 块的作用域之外。将声明行更改为 and it should work。string ou = string.Empty;

3赞 Anton Gogolev 2/25/2009 #4

这个片段甚至不会编译,更不用说打印了。C# 强制所有变量在访问之前进行初始化,这在您的情况下并不总是正确的。因此改变ou

string ou;

说:

string ou = "";

会做得很好。

评论

0赞 Anton Gogolev 2/25/2009
对那些投反对票的人:你到底不同意什么?
0赞 Alex 5/5/2009
我没有对它投反对票,但我的问题是 =“”,出于可读性原因,它应该是 = String.Empty。
5赞 Martijn 2/25/2009 #5

尝试将第二行替换为

string ou = null;

问题是,如果 nom 不等于 “1”,变量 ou 就不会被初始化。这里的编译器希望保证 ou 已被分配一个值。

6赞 teedyay 2/25/2009 #6

这甚至会编译吗?

nom是一个 - 你怎么能做?stringnom += 1

评论

4赞 Jon Skeet 2/25/2009
同理 string foo = “User id=” + 10;工程。结果是“User id=10”。在这里,nom 将是“11”。诚然,这可能不是预期的结果......
0赞 abatishchev 2/25/2009
1 将在串联之前转换为字符串。它等于 nom += 1.ToString()
1赞 GeekyMonkey 2/25/2009 #7

另一种选择是在 else 中设置 ou:

if (nom == "1")
{
    nom +=1;
    ou = nom;
} else 
{
    ou = "blank value";
}