在C#中,为什么我在声明它时会看到存储在我的i​​nt变量中的零,但是仍然会收到错误,说我应该初始化它?

vex*_*exe 8 c# variables

在C#中,如果我这样做:

int x;
Run Code Online (Sandbox Code Playgroud)

然后点击F10,我看到存储在x中的零.

但是当我尝试使用x时,它告诉我应该初始化它..为什么会这样?那里应该是零,对吧?

关于数组也是如此,所以:

int[]a = new int[5];
Run Code Online (Sandbox Code Playgroud)

如果我们F10那么,我们会看到那里的所有整数都是零.

这是怎么回事 ?为什么我必须在C#中初始化一个变量而不像C++?

Dan*_*dor 7

这是一个编译时错误,试图帮助您减少由于未初始化的变量导致的代码中的错误.很有用.

http://msdn.microsoft.com/en-us/library/4y7h161d(VS.80).aspx

更多阅读:

http://blogs.msdn.com/b/abhinaba/archive/2005/11/08/490248.aspx

关于禁用错误的一些话(你不能只是警告你 - 这不是警告):

http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/a073ccea-c43b-4536-be76-41949f0e2135

http://blogs.msdn.com/b/ericlippert/archive/2009/10/12/absence-of-evidence-is-not-evidence-of-absence.aspx (证明该主题信息最丰富)

甚至更多讨论"localsinit"IL标志(强制为本地人设置默认值)之间的关系及其与"双重赋值"的关系(C#强制你写,int v=0即使它已经存在).如果你想更深入地阅读 - 这里提供ECMA-335第I.12.2节中定义的"localsinit" .

  • 只是初始化局部变量而不是禁用编译器错误,你会好得多. (5认同)
  • 答案不完整.C#中的一些变量确实初始化为默认值(例如静态变量或实例变量).另一方面,局部变量未初始化为默认值. (4认同)
  • @ChristopherBerman,所有局部变量*由于C#设置"localsinit"标志而被运行时初始化为0,以强制将为局部变量分配的内存设置为0.编译器(在我看来)坚持初始化. (3认同)