【发布时间】: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的字段
标签: c# protocol-buffers protobuf-net