Roslyn的CompilationUnitSyntax.ReplaceNode中的歧义

时间:2014-02-22 01:59:46

标签: c# roslyn

我正在尝试使用Roslyn替换类的CompilationUnitSyntax。

但是,我正在使用的 ReplaceNode 与Roslyn常见问题解答中的 ReplaceNode 以及我查看过的任何StackOverflow问题都有不同的签名。任何人都可以指出为什么会这样,我如何使用 ReplaceNode 旧的ClassDeclarationSyntax new ClassDeclarationSyntax 作为参数?

我正在看九月CTPFAQ¹,方法:

    [FAQ(26)]
    public void AddMethodToClass()

特别是以下一行:

        CompilationUnitSyntax newCompilationUnit =
            compilationUnit.ReplaceNode(classDeclaration, newClassDeclaration);

当我尝试构建此代码时,我收到错误,因为ReplaceNode需要不同的参数:

 'Roslyn.Compilers.CSharp.CompilationUnitSyntax' does not contain a definition for 'ReplaceNode' and the best extension method overload
 'Roslyn.Compilers.CSharp.SyntaxExtensions.ReplaceNode<TRoot>(TRoot,
 Roslyn.Compilers.CSharp.SyntaxNode,
 Roslyn.Compilers.SyntaxRemoveOptions,
 System.Func<Roslyn.Compilers.CSharp.SyntaxNode,Roslyn.Compilers.CSharp.SyntaxTriviaList>,
 System.Func<Roslyn.Compilers.CSharp.SyntaxNode,Roslyn.Compilers.CSharp.SyntaxTriviaList>)'

¹我很确定我正在使用九月CTP:

我正在使用%userprofile%\ Documents \ Microsoft Roslyn CTP - 2012年9月的常见问题解答\ CSharp \ APISampleUnitTestsCS \ FAQ.cs

NuGet说我的Roslyn软件包的版本为1.2.20906.2

1 个答案:

答案 0 :(得分:6)

ReplaceNode()有两个重载(都是扩展方法):

  1. public static TRoot ReplaceNode<TRoot, TNode>(
        this TRoot root, TNode oldNode, TNode newNode)
        where TRoot : CommonSyntaxNode where TNode : CommonSyntaxNode;
    

    Roslyn.Compilers.CommonSyntaxNodeExtensions

  2. public static TRoot ReplaceNode<TRoot>(
        this TRoot root, SyntaxNode node, SyntaxRemoveOptions options, 
        Func<SyntaxNode, SyntaxTriviaList> keepLeadingTrivia = null,
        Func<SyntaxNode, SyntaxTriviaList> keepTrailingTrivia = null)
        where TRoot : SyntaxNode
    

    Roslyn.Compilers.CSharp.SyntaxExtensions

  3. 您想要第一个,但错误消息会谈到第二个,表明您遗漏了using Roslyn.Compilers;