在 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; }
}
但是,修复代码生成也可能有意义吗?