C# 编译protobuf网络生成的编解码器时出错
protobuf net生成的代码中存在有趣的错误。原型定义文件包含对象名为“值”的字段。使用-p:detectMissing选项为该值生成了什么protogen.exe:C# 编译protobuf网络生成的编解码器时出错,c#,protocol-buffers,protobuf-net,C#,Protocol Buffers,Protobuf Net,protobuf net生成的代码中存在有趣的错误。原型定义文件包含对象名为“值”的字段。使用-p:detectMissing选项为该值生成了什么protogen.exe: private int? _value; [global::ProtoBuf.ProtoMember(50, IsRequired = false, Name=@"value", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)] [gl
private int? _value;
[global::ProtoBuf.ProtoMember(50, IsRequired = false, Name=@"value", DataFormat = global::ProtoBuf.DataFormat.TwosComplement)]
[global::System.Xml.Serialization.XmlElement(@"value", Order = 50)]
public int value
{
get { return _value ?? default(int); }
set { _value = value; }
}
[global::System.Xml.Serialization.XmlIgnore]
[global::System.ComponentModel.Browsable(false)]
public bool valueSpecified
{
get { return _value != null; }
set { if (value == (_value == null)) _value = value ? value : (int?)null; }
}
private bool ShouldSerializevalue() { return valueSpecified; }
private void Resetvalue() { valueSpecified = false; }
编译器产生一个错误,认为value是关键字,而不是类属性:
无法确定条件表达式的类型,因为存在
“bool”和“int”之间没有隐式转换
手动更改生成代码的解决方法:
public int valueWorkaround
{
get { return _value ?? default(int); }
}
public bool valueSpecified
{
get { return _value != null; }
set { if (value == (_value == null)) _value = value ? valueWorkaround : (int?)null; }
}
然而,修复代码生成也可能是有意义的?是的,修复代码生成也是有意义的。我想,您应该向项目贡献者报告它。是的,修复代码生成是有意义的。我想,你应该向项目贡献者报告。Hmmm。。。这里有关键字检查代码(用于添加@etc)-我想我错过了一个。我来看看。@marc我在两台不同的计算机上面临相同的问题(使用相同版本的VS和ProtoBufGenerator)。。。在一台计算机上,
此
被正确添加,而在另一台计算机上它不是。。。非常奇怪。。。由于dll指示为1.0.0.0(我们在两台计算机上使用的安装程序都是protobuf-net-VS10.msi
),所以无法确定ProtoBufGenerator的版本。@citizensane在安装文件夹中,您应该能够直接比较文件;然而,对于codegen来说,最重要的是xslt:protobuf-net.dll的版本将有助于准确理解它们是在什么时间点(svn commit)上构建的from@marc谢谢你,马克,如果从同一个安装程序开始,有人手动编辑了csharp.xslt
文件,并在为public bool XXX specified
生成代码时,将XXX
前缀加上this.XXX
,以解决名为value
的字段。。。他只是忘了提醒团队中的每一个人这次修改。@marc@aleksey有关信息,我将修改的csharp.xslt
放在这里:。。。与安装有protobuf-net-VS10.msi
的行相比,只修改了几行,并且只打算解决名为value
Hmmm的字段。。。这里有关键字检查代码(用于添加@etc)-我想我错过了一个。我来看看。@marc我在两台不同的计算机上面临相同的问题(使用相同版本的VS和ProtoBufGenerator)。。。在一台计算机上,此
被正确添加,而在另一台计算机上它不是。。。非常奇怪。。。由于dll指示为1.0.0.0(我们在两台计算机上使用的安装程序都是protobuf-net-VS10.msi
),所以无法确定ProtoBufGenerator的版本。@citizensane在安装文件夹中,您应该能够直接比较文件;然而,对于codegen来说,最重要的是xslt:protobuf-net.dll的版本将有助于准确理解它们是在什么时间点(svn commit)上构建的from@marc谢谢你,马克,如果从同一个安装程序开始,有人手动编辑了csharp.xslt
文件,并在为public bool XXX specified
生成代码时,将XXX
前缀加上this.XXX
,以解决名为value
的字段。。。他只是忘了提醒团队中的每一个人这次修改。@marc@aleksey有关信息,我将修改的csharp.xslt
放在这里:。。。与使用protobuf-net-VS10.msi安装的行相比,只修改了几行,并且只打算解决名为value