GetEntriesChangedObservable
が基本コンストラクタから呼び出され、FMyEntries
がnull
であるため、このコンストラクタがまだ呼び出されていないため、このコードは正しく動作しません。いずれかのコンストラクタが呼び出される前に、それが価値を持つようにFMyEntries
初期化する必要がありますどのようにコンストラクタが呼び出される前にF#のフィールドを初期化するには?
type MyEnumDefinition() =
inherit DynamicEnumDefinitionBase<MyEnumDefinition>()
let FMyEntries : ObservableCollection<string> = ObservableCollection<string>()
//gets called from base constructor
override this.GetEntriesChangedObservable() =
Observable.FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
(fun h -> FMyEntries.CollectionChanged.AddHandler h), //FMyEntries is null
(fun h -> FMyEntries.CollectionChanged.RemoveHandler h)) //FMyEntries is null
?
C#ではそれは次のようになります。
//initialized before constructor
ObservableCollection<string> FMyEntries = new ObservableCollection<string>();
//gets called from base constructor
protected override IObservable<object> GetEntriesChangedObservable()
{
return Observable.FromEventPattern<NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>(
h => FMyEntries.CollectionChanged += h,
h => FMyEntries.CollectionChanged -= h);
}
EDIT: 短い答えを、それは不可能です! Fyodor Soikinによって提案されたハックを適用しても、F#ランタイムは初期化プロセスをチェックし、コンストラクタが独自のインスタンスの場合に任意のメンバにアクセスしようとすると例外をスローします。
最後に、コンストラクタと同じようにInitialize()関数を追加して解決しました。
'FMyEntries'がヌルであると判明した時点のコールスタックは何ですか? –
良い点は、間違ったトラックにあった。私は質問を編集しました。 – thalm