var:a Type或关键字

Cas*_*jne 10 c# language-features

MSDN归类varTypes.

在方法范围声明的变量可以具有隐式类型var

'隐式类型var'在这种情况下意味着什么?

严格说,如果我有它向其他程序员解释.

我能说......么; var是一个Type,或者我不得不说; var是一个关键字,指示编译器确定类型本身.

注意:这并不是要开始讨论var,也不是要学习var的用法.一劳永逸我想知道如何描述它并且msdn有点令人困惑,就是这样.

Jon*_*eet 14

var是一个上下文关键字 -连同yield,addget例如.

换句话说,您可以将其用作标识符而不用@作为前缀,但在某些地方它仍然对编译器具有特殊含义(即,对于局部变量声明,类型名称是预期的).

使用var声明一个局部变量要求编译器推断的变量的基础上在右手侧的表达式的类型.例如:

var list = new List<string>();
var anon = new { Foo = "bar" };
Run Code Online (Sandbox Code Playgroud)

类型listList<string>; 类型anon匿名类型,也是在C#3中引入的.引入C#3的部分原因var是允许使用匿名类型的强类型变量 - 变量仍然具有适当的编译时类型,即使你不能明确说明该类型.

var但是,如果编译器没有足够的信息,有一些情况不起作用:

var cantUseNull = null;
var cantUseLambda = x => x.Length;
Run Code Online (Sandbox Code Playgroud)

还有其他人.在每种情况下,您都可以在右侧转换表达式,以便编译器知道要使用的内容 - 但在这种情况下,您也可以只显式声明变量.

<plug>
您可以在深度C#中阅读更多相关信息.幸运的是,涵盖此内容的章节仍可从第一版页面免费获得(您希望第8章).我不记得我在第二版中改变了多少章节......
</plug>


Eri*_*ert 11

我可以说var是一种类型,还是我必须说var是一个指示编译器确定类型的关键字

这取决于你怎么看了.认真!

C#编译器对程序进行三种分析,每次后续分析都会消耗前一次的结果.我们做的第一种分析是词法分析; 我们将文本转换为一系列令牌.假设你有

class C { static void Main(){ var x = 123; } }
Run Code Online (Sandbox Code Playgroud)

我们首先确定那些令牌是CLASS IDENTIFIER(C)LEFTBRACE STATIC VOID IDENTIFIER(主要)LEFTPAREN RIGHTPAREN LEFTBRACE IDENTIFIERTHATMIGHTBEAKEYWORD(var)IDENTIFIER(x)EQUALS INTEGER(123)SEMICOLON RIGHTBRACE RIGHTBRACE.

在这个分析阶段,"var"是一个带有注释的标识符,表示它可能是关键字var,而不是标识符var.

我们接下来的分析是语法分析,其中令牌被组织成组,形成"解析树".在这种情况下,令牌将被组织到此树中(缩进指示树中的嵌套级别)

declaration of class: CLASS
  class name: IDENTIFIER(C)
  class body begins: LEFTBRACE
    declaration of method:
      method modifier: STATIC
      return type: VOID
      method name: IDENTIFIER(Main)
        formal parameter declarations:
          formal parameter declarations begin: LEFTPAREN
          formal parameter declarations end: RIGHTPAREN
        method body:
          method body begins: LEFTBRACE
            local declaration statement:
              type: IDENTIFIERTHATMIGHTBEAKEYWORD(var)
              local name: IDENTIFIER(x)
              initializer:
                assignment operator: EQUALS
                integer literal expression: INTEGER(123)
              statement ends: SEMICOLON
           method body ends: RIGHTBRACE
  class body ends: RIGHTBRACE
Run Code Online (Sandbox Code Playgroud)

此时var已被语法分类为类型.如果这是一个语法上合法的程序,它就在我们期望的类型声明的地方.

但是在这一点上我们不知道"var"是指一个类型还是被用作关键字.这需要语义分析.

当我们对解析树进行语义分析时,我们说"好吧,有一个C类,它有一个方法Main,它声明了一个局部变量x.那个局部变量的类型是什么?"

此时有两种可能性.第一种可能性是在全局命名空间中有一个名为"var"的类,结构,枚举,接口或委托类型.(此程序片段中没有"using"指令,因此我们不必检查任何其他名称空间,并且类型不是部分的,因此我们不必检查任何其他类型的声明).我们搜索所有引用程序集的全局命名空间,查找名为"var"的类型.我们还对所有其他文件中的类型声明进行语义分析,再次查找名为var的类型.

如果我们找到一个,那么"var"指的是那个类型.

如果我们没有找到,那么我们假设"var"被用作引入隐式类型本地的上下文关键字.

那么,回答你的问题:

从词汇上讲,代码片段"var"是一个标识符标记,上面有一个注释,"顺便说一下,这实际上可能是一个关键字".

在语法上,标记"var"是一种类型,它出现在语法中预期类型的​​位置.

从语义上讲,类型语法"var"是一个类型,当范围中有一个名为var的类型 ; 如果没有这样的类型并且"var"被用作本地声明的类型,则类型语法"var"不引用类型.相反,它是编译器推断本地实际类型的指令.