Roslyn - 属性声明分析错误

Roslyn - Property declaration parse errors

提问人:Jürgen Böhm 提问时间:10/19/2023 最后编辑:Jürgen Böhm 更新时间:10/19/2023 访问量:35

问:

目前,我正在为 C# 代码编写一个小类成员声明排序器。

在测试过程中,我偶然发现了以下代码示例,其中包含 PropertyDeclarations,该示例未成功解析(该示例当然是变量的内容,而不是下面的整个代码):programText

代码

private void ParseIt()
{
    string programText = @"

public class Image : ViewModifyDataBase
{

    public BoolParameter IsTransformSelfCentered { get; init; } = new(new BaseModels.BoolParameter(false));

    public ValueParameter<double> OffsetX { get; init; } = new(new BaseModels.ValueParameter<double>(0, double.MinValue, double.MaxValue));

    public ValueParameter<double> OffsetY { get; init; } = new(new BaseModels.ValueParameter<double>(0, double.MinValue, double.MaxValue));

}
    ";

    var tree = CSharpSyntaxTree.ParseText(programText);
    var icml = tree.GetRoot().DescendantNodes().Where(nd => nd.Kind() == SyntaxKind.IncompleteMember).ToList();
    // Unfortunately icml is not empty:         
    foreach(var elem in icml)
    {
        Console.WriteLine($"IncompleteMember: {elem.ToFullString()}");
    }
}

给出以下输出

IncompleteMember: new BaseModels.BoolParameter
IncompleteMember: (false));

IncompleteMember: new BaseModels.ValueParameter<double>
IncompleteMember: (0, 
IncompleteMember: double.
IncompleteMember: MinValue, 
IncompleteMember: double.
IncompleteMember: MaxValue));

IncompleteMember: new BaseModels.ValueParameter<double>
IncompleteMember: (0, 
IncompleteMember: double.
IncompleteMember: MinValue, 
IncompleteMember: double.
IncompleteMember: MaxValue));

然而,上面用于分析的代码片段在普通 VisualStudio(作为较大文件的一部分)中编译良好,并且 RoslynQuoter 不会产生任何警告。

我该怎么做才能在我的代码中完成正确的解析?ParseText() 中是否需要特殊参数设置?

编辑:我的roslyn(和其他)版本:

  <ItemGroup>
    <PackageReference Include="AvalonEdit" Version="6.3.0.90" />
    <PackageReference Include="Microsoft.Build.Locator" Version="1.2.2" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="2.9.8" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="3.3.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic.Workspaces" Version="3.3.1" />
    <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="3.3.1" />
  </ItemGroup>

另一个编辑:(根据您的建议我的新设置):

  <ItemGroup>
    <PackageReference Include="AvalonEdit" Version="6.3.0.90" />
    <PackageReference Include="Microsoft.Build.Locator" Version="1.2.2" />
    <PackageReference Include="Microsoft.CodeAnalysis.Analyzers" Version="3.3.4" PrivateAssets="all" />
    <PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="4.7.0" />
    <PackageReference Include="Microsoft.CodeAnalysis.VisualBasic.Workspaces" Version="4.7.0" />
    <PackageReference Include="Microsoft.CodeAnalysis.Workspaces.MSBuild" Version="4.7.0" />
  </ItemGroup>
C# 分析 Roslyn

评论

1赞 Dai 10/19/2023
你使用的是 post-C#9 的“target-typed”运算符 - 你的分析程序使用的是哪个版本的 Roslyn 分析器?旧版本的 Roslyn/ 库无法分析目标类型表达式。new()CodeAnalysis
0赞 Jürgen Böhm 10/19/2023
谢谢你的提示!我添加了用于绘制 Roslyn 模块的线条(从 Visual Studio 2022 中的 roslyn cli 项目标准设置中复制了它们)。
1赞 Dai 10/19/2023
你使用的版本早于 C# 9 - 应更新到当前 NuGet 版本(即 4.7.0)3.3.1
0赞 Jürgen Böhm 10/19/2023
再次感谢你:它现在对我来说完美无缺!
1赞 Dai 10/19/2023
您可能需要考虑删除这些包并引用 - 因为它会自动拉入其他包的正确版本。Microsoft.CodeAnalysis

答:

1赞 Dai 10/19/2023 #1

将我的评论转换为答案:

OP 使用的是旧版本的 NuGet 包,这些包早于 C# 9.0 中引入的目标类型运算符。Microsoft.CodeAnalysis.*new()

截至 2023 年第 3 季度,这些 NuGet 包的当前版本为 4.7.0,因此请更新到这些版本。

但是,您只需要引用单个包,它就会自动拉入其他包,而不是为单个包提供 PackageReferences:Microsoft.CodeAnalysis.etc...Microsoft.CodeAnalysis

  <ItemGroup>
    <PackageReference Include="AvalonEdit" Version="6.3.0.90" />
    <PackageReference Include="Microsoft.Build.Locator" Version="1.2.2" />
    <PackageReference Include="Microsoft.CodeAnalysis" Version="4.7.0" />
  </ItemGroup>

(可能需要也可能不需要,具体取决于使用 Roslyn 的方式)PrivateAssets="all"