编译 protobuf-net 生成的代码时出错
Posted
技术标签:
【中文标题】编译 protobuf-net 生成的代码时出错【英文标题】:Error while compiling protobuf-net generated codecode 【发布时间】:2012-04-16 22:35:04 【问题描述】:在 protobuf-net 生成的代码中有有趣的错误。 .proto 定义文件包含对象的名为“值”的字段。使用 -p:detectMissing 选项为该值生成的 protogen.exe:
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;
但是,修复代码生成可能也有意义吗?
【问题讨论】:
嗯...那里有关键字检查代码(用于添加@等)-猜我错过了一个。我去看看。 @marc 我在两台不同的计算机上面临同样的问题(具有相同版本的 VS 和 ProtoBufGenerator)......在一台计算机上正确添加了this
而在另一台计算机上却没有... 非常奇怪... 无法确定 ProtoBufGenerator 版本,因为 dll 指示 1.0.0.0(我们用于两台计算机的安装程序是 protobuf-net-VS10.msi
)。
@CitizenInsane 在安装文件夹中,您应该可以直接比较文件;对于 codegen,最重要的是 xslt,然而:来自 protobuf-net.dll 的版本将有助于准确了解它们是从哪个时间点(svn commit)构建的
@marc 谢谢 Marc,确实,如果从同一个安装程序开始,有人手动编辑了 csharp.xslt
文件,并在为 public bool XXXSpecified
生成代码以解决名为 @ 的字段时以 XXX
为前缀987654330@ ...他只是忘记警告团队中的每个人进行此修改。
@marc @aleksey 有关信息,我已将修改后的csharp.xslt
放在这里:gist.github.com/3748744 ... 与使用protobuf-net-VS10.msi
安装的行相比,仅修改了几行,并且只打算解决名为value
的字段
【参考方案1】:
是的,修复代码生成是有意义的。我想,你应该向项目贡献者报告。
【讨论】:
以上是关于编译 protobuf-net 生成的代码时出错的主要内容,如果未能解决你的问题,请参考以下文章
将 protobuf-net RuntimeTypeModel 编译为 C#,而不是 DLL
protobuf-net - 反引号、字典和 .proto 文件
vs2008SP1+AutoCAD2010+ObjectARX2010编译出错