2017-03-10 7 views
3

私はXMLからデシリアライズした場合、私は次のエラーを取得する:The initialization of an object or value resulted in an object or value being accessed recursively before it was fully initialized.creatsがinit @変数のときは?

私のF#コードは、次のようになります。

[<...>] 
[<...>] 
[<DataContract>] 
type DerivedClass() as X = class 
    inherit BaseClass() 
    [<DataMember>] 
    [<Input>] 
    [<DefaultValue>] 
    val mutable MemberName: myType 
    .... 

私は結果を見てILSpyを使用してデバイスを保護117値@ INITを取得初期化の前にアクセスしてください。

...  
[..., DataContract] 
[System.Serializable] 
public class DerivedClass : BaseClass 
{ 
[..., DefaultValue, DataMember] 
public modulName.myType MemberName; 

internal int [email protected]; 
    ... 

私の他のすべてのクラスは、init @変数を取得せず、期待通りにデシリアライズしません。なぜinit @が作成され、時にはそうではないのですか?答えは自分のコードを修正するのに役立ちます。

編集

@は、タイプのsourcコード行の略後数。

asとタイプの参照、編集2

はそう

... 
type DerivedClass() = class 
... 

... 
type DerivedClass() as X = class 
... 

を変更InstanceMembersNeedSafeInitCheckためHasSelfReferentialConstructor reponsibleを作成するには、私のために問題を解決しました。 asとタイプを参照

答えて

4

ので

... 
type DerivedClass() = class 
... 

... 
type DerivedClass() as X = class 
... 

を変更HasSelfReferentialConstructor reponsible for theInstanceMembersNeedSafeInitCheck私のために問題を解決を作成します。

+1

この詳細は、実際に私にとって大きなパフォーマンス低下を引き起こしました。 – FuleSnabel

+0

'' do''は型定義の中で見た目がいいですが、 '' new() ''はよりパフォーマンスの高いコードを生成します。最終的に、コンパイラで "init @"を作成する理由を見つけるためにコンパイラを調べました。 –

関連する問題