如何使用Roslyn声明一个var变量?

16

我有以下的代码,但是我不知道如何获取变量TypeSyntax。 有什么想法吗?

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

这会导致参数异常,提示为:"keyword"

4个回答

28

我会使用:

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

2
是的,问题在于 at 实际上不是一个关键字,它是我们所谓的上下文关键字。 - Kevin Pilch

19

Jb Evain的答案是正确的。我想补充一下,错误的原因是因为"var"不是一个预定义类型,预定义类型例如"int"或者"string"。

语法分析器不知道你是否在作用域内有一个名为"var"的类;"var"被视为不是一个预定义类型,而是只是另一个类型的名称。只有当我们找不到作用域内命名为"var"的类型时,语义分析器才会决定这必须是一个隐式类型的本地变量。

这样做的原因是因为"var"是在C# 3中添加的,在可能使用"var"作为类型名称的C# 1或2程序中。我们不希望破坏这些程序。


谢谢解释,Eric。现在我明白了。我想我迷失了方向,因为我没有意识到 IdentifierNameSyntax 是 TypeSyntax,而且我缺少一些上下文。 - Sebastian Piu

7

这不是一个确切的回答你问题的方法,但是另一种(更简单)实现相同效果的方法是使用Syntax.ParseStatement:

Syntax.ParseStatement("var " + name);

1
+1 更加“声明式”。我投票支持在C#中添加_code引用_,并进行插值。就像Nemerle中的这样:<| var $name; |>. - Jordão

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接