Ошибка при компиляции кода, сгенерированного protobuf-net.

Есть забавная ошибка в сгенерированном коде 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; }
}

Однако, возможно, имеет смысл также исправить кодогенерацию?


person Aleksey Kontsevich    schedule 16.04.2012    source источник
comment
Хм... там есть код проверки ключевых слов (для добавления @ и т. д.) - думаю, я пропустил один. Я взгляну.   -  person Marc Gravell    schedule 17.04.2012
comment
@marc Я столкнулся с одной и той же проблемой на двух разных компьютерах (с одинаковой версией VS и ProtoBufGenerator) ... На одном компьютере this добавляется правильно, а на другом - нет ... очень странно ... Can' На самом деле я не могу сказать о версии ProtoBufGenerator, так как dll указывает 1.0.0.0 (установщик, который мы использовали для обоих компьютеров, был protobuf-net-VS10.msi).   -  person CitizenInsane    schedule 18.09.2012
comment
@CitizenInsane в папке установки, вы сможете напрямую сравнивать файлы; для codegen важнее всего xslt, однако: версия из protobuf-net.dll поможет понять, из какого именно момента времени (svn commit) они были собраны   -  person Marc Gravell    schedule 18.09.2012
comment
@marc Спасибо, Марк, действительно, если, начиная с того же установщика, кто-то вручную редактировал файл csharp.xslt и добавлял префикс XXX к this.XXX при создании кода для public bool XXXSpecified для обходных полей с именем value ... он просто забыл предупредить всех в команде об этой модификации.   -  person CitizenInsane    schedule 19.09.2012
comment
@marc @aleksey Для информации я разместил измененный csharp.xslt здесь: gist.github.com/3748744 . .. Только несколько строк были изменены по сравнению с тем, что было установлено с protobuf-net-VS10.msi, и предназначены только для обхода полей с именем value   -  person CitizenInsane    schedule 19.09.2012


Ответы (1)


Да, имеет смысл исправить генерацию кода. Я думаю, вы должны сообщить об этом участникам проекта.

person usr    schedule 16.04.2012