2

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; }
}

しかし、おそらくコード生成も修正するのは理にかなっているでしょうか?

4

1 に答える 1

0

はい、コード生成を修正することは理にかなっています。プロジェクトの貢献者に報告する必要があると思います。

于 2012-04-16T22:57:46.273 に答える