Есть забавная ошибка в сгенерированном коде protobuf-net. Файл определения .proto содержит поле с именем «значение» для объекта. Что protogen.exe сгенерировал для этого значения с параметром -p:detectMissing:
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; }
}
Однако, возможно, имеет смысл также исправить кодогенерацию?
thisдобавляется правильно, а на другом - нет ... очень странно ... Can' На самом деле я не могу сказать о версии ProtoBufGenerator, так как dll указывает 1.0.0.0 (установщик, который мы использовали для обоих компьютеров, былprotobuf-net-VS10.msi). - person CitizenInsane   schedule 18.09.2012csharp.xsltи добавлял префиксXXXкthis.XXXпри создании кода дляpublic bool XXXSpecifiedдля обходных полей с именемvalue... он просто забыл предупредить всех в команде об этой модификации. - person CitizenInsane   schedule 19.09.2012csharp.xsltздесь: gist.github.com/3748744 . .. Только несколько строк были изменены по сравнению с тем, что было установлено сprotobuf-net-VS10.msi, и предназначены только для обхода полей с именемvalue- person CitizenInsane   schedule 19.09.2012