提问人:Jürgen Böhm 提问时间:10/19/2023 最后编辑:Jürgen Böhm 更新时间:10/19/2023 访问量:35
Roslyn - 属性声明分析错误
Roslyn - Property declaration parse errors
问:
目前,我正在为 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>
答:
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"
评论
new()
CodeAnalysis
3.3.1
Microsoft.CodeAnalysis