Как мне объявить переменную var с Roslyn? - PullRequest
16 голосов
/ 06 декабря 2011

У меня есть следующий фрагмент кода, но я не могу найти, как получить переменную TypeSyntax. Есть идеи?

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

это завершается с исключением аргумента, который говорит: "ключевое слово"

Ответы [ 4 ]

26 голосов
/ 06 декабря 2011

Я бы использовал:

Syntax.LocalDeclarationStatement(
    declaration: Syntax.VariableDeclaration(
        type: Syntax.IdentifierName(Syntax.Token(SyntaxKind.VarKeyword)),
        variables: Syntax.SeparatedList(
            Syntax.VariableDeclarator(
                identifier: Syntax.Identifier(name)))));
19 голосов
/ 06 декабря 2011

Jb Эвайн ответ правильный;Я просто подумал, что добавлю, что причина ошибки в том, что «var» не является предопределенным типом .Предопределенный тип - это что-то вроде «int» или «string».

Синтаксический анализатор не знает, есть ли у вас класс с именем "var" в области видимости;«var» обрабатывается не как предопределенный тип, а как просто другое имя для другого типа.Только если мы не можем найти тип в области видимости с именем "var", семантический анализатор затем решит, о, это должен быть неявно типизированный локальный объект.

Причина этого в том, что "var"был добавлен в C # 3, и могут быть программы на C # 1 или 2, которые используют" var "в качестве имени типа.Мы не хотели ломать эти программы.

7 голосов
/ 10 декабря 2011

Не точный ответ на ваш вопрос, но другим (и более простым) способом достижения того же эффекта было бы использование Syntax.ParseStatement:

Syntax.ParseStatement("var " + name);
3 голосов
/ 23 июля 2012

Чтобы упростить ответы на подобные вопросы, я написал инструмент под названием Quoter, который может генерировать вызовы API синтаксического дерева для любой конкретной программы на C #:

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

...