如何用Roslyn声明var变量?

时间:2011-12-06 12:56:53

标签: c# roslyn

我有以下代码,但我找不到如何获取var TypeSyntax。 有什么想法吗?

Syntax.LocalDeclarationStatement(                   
    declaration: Syntax.VariableDeclaration(
        type: Syntax.PredefinedType(Syntax.Token(SyntaxKind.VarKeyword)),
        variables: Syntax.SeparatedList(
        Syntax.VariableDeclarator(
            identifier: Syntax.Identifier(name)))
        )
    )
);

这会失败并出现一个Argument异常,上面写着:“keyword”

4 个答案:

答案 0 :(得分:26)

我会用:

Syntax.LocalDeclarationStatement(
    declaration: Syntax.VariableDeclaration(
        type: Syntax.IdentifierName(Syntax.Token(SyntaxKind.VarKeyword)),
        variables: Syntax.SeparatedList(
            Syntax.VariableDeclarator(
                identifier: Syntax.Identifier(name)))));

答案 1 :(得分:19)

Jb Evain的回答是正确的;我只是认为我会补充说错误的原因是因为“var”不是预定义类型。预定义类型类似于“int”或“string”。

语法分析器不知道你是否在范围内有一个名为“var”的类; “var”不是作为预定义类型处理,而是仅作为另一种类型的另一个名称。只有当我们找不到名为“var”的作用域中的类型时,语义分析器才会决定,哦,这必须是一个隐式类型的本地。

原因是因为在C#3中添加了“var”,并且可能存在使用“var”作为类型名称的C#1或2程序。我们不想打破这些计划。

答案 2 :(得分:7)

对你的问题不是一个精确的答案,但是另一种(和更简单的)方法来实现相同的效果将是使用Syntax.ParseStatement:

Syntax.ParseStatement("var " + name);

答案 3 :(得分:3)

为了简化回答这些问题,我编写了一个名为Quoter的工具,它可以为任何给定的C#程序生成语法树API调用:

http://blogs.msdn.com/b/kirillosenkov/archive/2012/07/22/roslyn-code-quoter-tool-generating-syntax-tree-api-calls-for-any-c-program.aspx