Когда создает fsc переменную init@?

Если я десериализую из XML, я получаю следующую ошибку: The initialization of an object or value resulted in an object or value being accessed recursively before it was fully initialized.

Мой код F # выглядит следующим образом:

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

Я использовал ILSpy, чтобы посмотреть на результат и получить значение init@117, которое защищает от доступа до инициализации.

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

internal int init@117;
    ...

Все другие мои классы не получают переменную init@ и не десериализуются, как ожидалось. Почему init@ иногда создается, а иногда нет? Ответ может помочь мне исправить мой код.

Изменить

Число после символа @ обозначает строку исходного кода типа.

Изменить 2

Ссылка на тип с помощью as создает HasSelfReferentialConstructor, ответственный за InstanceMembersNeedSafeInitCheck, поэтому изменение

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

to

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

решил проблему для меня.


person Peter Siebke    schedule 10.03.2017    source источник


Ответы (1)


Ссылка на тип с помощью as создает HasSelfReferentialConstructorreponsible for theInstanceMembersNeedSafeInitCheck, поэтому изменение

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

to

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

решил проблему для меня.

person Peter Siebke    schedule 10.03.2017
comment
Эта деталь однажды вызвала у меня значительное снижение производительности. - person Just another metaprogrammer; 10.03.2017
comment
do выглядит красиво в определении типа, но new() дает более производительный код. Мне потребовалось некоторое время, чтобы понять, наконец, я заглянул в компилятор, чтобы найти причину создания init@ - person Peter Siebke; 11.03.2017