【问题标题】:How do I declare a var variable with Roslyn?如何使用 Roslyn 声明 var 变量?
【发布时间】:2020-05-19 01:27:50
【问题描述】:

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

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

这会失败并出现一个参数异常:“keyword”

【问题讨论】:

    标签: c# roslyn


    【解决方案1】:

    我会使用:

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

    【讨论】:

    • 是的,问题在于 at 实际上不是关键字,它是我们所说的上下文关键字。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢 Eric 的解释,现在说得通了。我想我迷路了,因为我没有意识到 IdentifierNameSyntax 是一个 TypeSyntax,我错过了一些上下文
    【解决方案3】:

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

    Syntax.ParseStatement("var " + name);
    

    【讨论】:

    • +1 更多的“声明性”。我投票将 代码引用 添加到 C# 中,并带有插值。 Nemerle 中的类似内容:<| var $name; |>.
    【解决方案4】:

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

    https://roslynquoter.azurewebsites.net

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2015-03-14
      • 1970-01-01
      • 2011-10-28
      相关资源
      最近更新 更多