使用protoc生成C#代码时能否将子消息标记为可空引用类型?
用protoc生成C#代码时给子消息属性加可空标记
在启用了<Nullable>enable</Nullable>的C#项目里,用protoc生成的代码中,子消息类型的属性默认不会带上?可空修饰符,但实际运行时这些属性完全可能被赋值为null,导致空引用警告或潜在bug。要让protoc自动生成带可空标记的属性,其实是有办法的:
先确保用的是新版Protobuf工具
Google.Protobuf从3.21.0版本开始,支持生成带可空引用类型标记的C#代码,所以先把Google.Protobuf包升级到3.21.0及以上版本。命令行生成时加参数
执行protoc命令时,添加csharp_opt=nullable参数就行,示例命令:protoc --csharp_out=./生成代码目录 --csharp_opt=nullable 你的proto文件.proto项目文件里配置(适用于直接引用.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
相关产品推荐
相关产品推荐

