2017-03-10 2 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 값 @ 초기화를 받고 경비에 대한 그 초기화 전에 액세스하십시오.

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

internal int [email protected]; 
    ... 

다른 모든 클래스에는 init @ 변수가 없으며 예상대로 deserialize됩니다. init @가 때때로 만들어 지거나 때때로 만들어지지 않는 이유는 무엇입니까? 대답은 내 코드를 수정하는 데 도움이 될 수 있습니다.

편집

에서 @이 유형의 sourc 코드 라인의 약자 후 수입니다.

편집 2

as와 유형을 참조하기는 HasSelfReferentialConstructor 그래서

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

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

을 변경 InstanceMembersNeedSafeInitCheck에 대한 책임을지고있는 나를 위해 문제를 해결을 만듭니다. as와 유형을 참조하는

답변

4

소위

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

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

변경 HasSelfReferentialConstructor reponsible for theInstanceMembersNeedSafeInitCheck 날 문제 해결을 생성한다.

+1

이 세부 사항은 실제로 나를 위해 상당한 성능 회귀를 일으켰습니다. – FuleSnabel

+0

''do''는 타입 정의에서 멋지지만''new()''는 더 뛰어난 코드를 만듭니다. 알아내는 시간을 가졌습니다. 컴파일러에서''init @''을 만드는 이유를 찾았습니다. –