私は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
とタイプを参照
この詳細は、実際に私にとって大きなパフォーマンス低下を引き起こしました。 – FuleSnabel
'' do''は型定義の中で見た目がいいですが、 '' new() ''はよりパフォーマンスの高いコードを生成します。最終的に、コンパイラで "init @"を作成する理由を見つけるためにコンパイラを調べました。 –