编译 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编译出错

为紧凑框架预编译 protobuf-net 类型模型

protobuf-net 中日期时间的 .proto 消息是啥

C语言中,为啥这样的代码编译时出错i undeclared(first use in this function),