为什么隐式类型的局部变量必须在C#中而不是在JavaScript中初始化?

dis*_*ree -1 javascript c# variables initialization

if (i==101)
    {
        var lastLoopCheck;
    }
Run Code Online (Sandbox Code Playgroud)

Visual Studio 2013显示错误: - "必须初始化隐式类型的局部变量"

为什么?这是什么原因?

我的第一语言是JavaScript,其中允许未初始化的变量(本地和全局); 看看下面的(JavaScript)代码:

var foo;
alert(typeof foo); //undefined
Run Code Online (Sandbox Code Playgroud)

那么为什么在JavaScript中而不是在C#中允许使用未初始化的变量?

pax*_*blo 6

C#允许您使用var指定类型将以除明确说明之外的其他方式进行评估.对于过去看起来像这样的代码来说,这非常方便:

Type<string,int,int,int,int> xyzzy = new Type<string,int,int,int,int>();
Run Code Online (Sandbox Code Playgroud)

现在你可以做:

var xyzzy = new Type<string,int,int,int,int>();
Run Code Online (Sandbox Code Playgroud)

但是,变量本身仍然是静态类型的,因此类型必须在创建变量时可用,以便编译器可以知道如何处理它.

线索在于您看到的错误消息:

必须初始化隐式类型的局部变量

请注意,它是隐式类型而不是无类型.

所以,这些:

int x;       // explicit int.
var x = 7;   // implicit int because we're using int to set it.
var x;       // no idea what type this should be.
Run Code Online (Sandbox Code Playgroud)

前两个是可以的,因为类型信息是可用的.第三个是不对的,因为关于你想要什么类型的信息是不可用的.

对比使用vardynamic-后者是更密切相关,var在Javascript中,它的动态类型(A)和搞清楚什么可以做它被推迟到运行时.


(a)从技术上讲,我认为它仍然被认为是静态类型,但在编译时绕过常规类型检查.