2

疲れすぎて幻覚を見ているのかもしれませんし、実際には C# + Mono に問題があるのか​​もしれません!!

class のメソッドに出くわしながら、 Json.Netでテストとデバッグを行っていました。このメソッドは、 という名前の別のプライベート メソッドを呼び出します。に渡された引数の 1 つは、タイプで呼び出されます。このオブジェクトは、メソッドに渡される前に値を取得し、その後は null です!!SetPropertyValueJsonSerializerInternalReaderCalculatePropertyDetailsCalculatePropertyDetailsreaderJsonReaderCalculatePropertyDetails

ばかげているように聞こえるかもしれませんが、私は素朴ではないと信じていますが、そのような奇妙な行動を見るために何が起こったのでしょうか? 誰でも合理的な説明を思いつくことができますか? 私が知っているのは、このプロジェクトがマルチスレッドではなく、結果が再現可能であることだけです。

私が得た唯一の証拠は、コール スタックの一番上にある次の 2 つのエントリです。

Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CalculatePropertyDetails (property={Id}, propertyConverter={JsonRpcTest.ObjectIdConverter}, containerContract={Newtonsoft.Json.Serialization.JsonObjectContract}, containerProperty=(null), reader=(null), target=(null), useExistingValue=false, currentValue=(null), propertyContract=(null), gottenCurrentValue=false) in Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:792
Newtonsoft.Json.Serialization.JsonSerializerInternalReader.SetPropertyValue (property={Id}, propertyConverter={JsonRpcTest.ObjectIdConverter}, containerContract={Newtonsoft.Json.Serialization.JsonObjectContract}, containerProperty=(null), reader={Newtonsoft.Json.JsonTextReader}, target={JsonRpcTest.E}) in Newtonsoft.Json/Serialization/JsonSerializerInternalReader.cs:750

引数を探しreaderます。

私は Ubuntu 12.04、Mono 3.2.3、および Monodevelop 4.1.7 を使用しており、プロジェクトは を使用して開発されてMono / .Net 4.5います。

[アップデート]

SetPropertyValuewhereが定義され、whereCalculatePropertyDetailsが呼び出されるコードの一部を次に示します。

private bool SetPropertyValue(JsonProperty property, JsonConverter propertyConverter, JsonContainerContract containerContract, JsonProperty containerProperty, JsonReader reader, object target)
{
    object currentValue;
    bool useExistingValue;
    JsonContract propertyContract;
    bool gottenCurrentValue;

    if (CalculatePropertyDetails(property, ref propertyConverter, containerContract, containerProperty, reader, target, out useExistingValue, out currentValue, out propertyContract, out gottenCurrentValue))
        return false;
4

1 に答える 1