You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Roslyn解析C#属性声明出现IncompleteMember错误的解决咨询

Roslyn解析C#代码出现IncompleteMember错误的解决方案

问题

开发C#类成员声明排序工具时,一段可在Visual Studio正常编译、RoslynQuoter无警告的属性代码,通过Roslyn的CSharpSyntaxTree.ParseText解析时出现大量IncompleteMember错误。已尝试升级Roslyn版本,需解决正确解析的方法,确认是否需要为ParseText设置特殊参数。

测试代码

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();
    // 输出错误成员
    foreach(var elem in icml)
    {
        Console.WriteLine($"IncompleteMember: {elem.ToFullString()}");
    }
}

错误输出

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

IncompleteMember: new BaseModels.ValueParameter&lt;double&gt;
IncompleteMember: (0, 
IncompleteMember: double.
IncompleteMember: MinValue, 
IncompleteMember: double.
IncompleteMember: MaxValue));

IncompleteMember: new BaseModels.ValueParameter&lt;double&gt;
IncompleteMember: (0, 
IncompleteMember: double.
IncompleteMember: MinValue, 
IncompleteMember: double.
IncompleteMember: MaxValue));

版本配置

初始版本

<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. 修正代码文本中的HTML转义字符

问题核心是测试代码的programText中使用了HTML转义字符&lt;和&gt;代替C#语法中的<和>,Roslyn解析时会将这些转义字符视为普通文本,导致语法结构被破坏,进而产生IncompleteMember错误。

将programText中的&lt;替换为<,&gt;替换为>即可解决基础语法解析问题。

2. 指定匹配的C#语言版本(可选)

代码中使用了C# 9.0引入的init setter特性,建议在ParseText时明确指定对应语言版本,避免因默认版本不支持导致的解析问题:

var options = CSharpParseOptions.Default.WithLanguageVersion(LanguageVersion.CSharp9);
var tree = CSharpSyntaxTree.ParseText(programText, options);

修正后的完整测试代码不会再产生IncompleteMember错误,可正常解析所有类成员。

内容的提问来源于stack exchange,提问作者Jürgen Böhm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 01:40:02