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

使用protoc生成C#代码时能否将子消息标记为可空引用类型?

用protoc生成C#代码时给子消息属性加可空标记

在启用了<Nullable>enable</Nullable>的C#项目里,用protoc生成的代码中,子消息类型的属性默认不会带上?可空修饰符,但实际运行时这些属性完全可能被赋值为null,导致空引用警告或潜在bug。要让protoc自动生成带可空标记的属性,其实是有办法的:

  1. 先确保用的是新版Protobuf工具
    Google.Protobuf从3.21.0版本开始,支持生成带可空引用类型标记的C#代码,所以先把Google.Protobuf包升级到3.21.0及以上版本。

  2. 命令行生成时加参数
    执行protoc命令时,添加csharp_opt=nullable参数就行,示例命令:

    protoc --csharp_out=./生成代码目录 --csharp_opt=nullable 你的proto文件.proto
    
  3. 项目文件里配置(适用于直接引用.proto的情况)
    如果你的C#项目是直接通过<Protobuf>项引用.proto文件的,就在.csproj里给对应的Protobuf项加上额外参数:

    <ItemGroup>
      <Protobuf Include="你的proto文件.proto" GrpcServices="None" AdditionalProtocArguments="--csharp_opt=nullable" />
    </ItemGroup>
    

这样生成的代码就会像你期望的那样,子消息属性带上?标记:

class Main {
  Sub? Sub { get; set; }
}

class Sub {
  int Id { get; set; }
}

内容的提问来源于stack exchange,提问作者Loïc Morvan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:45:56