此代碼無法正常工作,因爲GetEntriesChangedObservable
由基礎構造函數調用,FMyEntries
爲null
,因爲它自己的構造函數尚未調用。如何在構造函數被調用之前初始化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
應該如何FMyEntries
進行初始化,使其具有任何構造函數之前的值被調用?
在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);
}
編輯: 簡短的回答,這是不可能的!即使應用Fyodor Soikin提出的破解,F#運行時也會檢查初始化過程,並在構造函數嘗試訪問任何成員(如果它自己的實例)時引發異常。
我最終通過添加與構造函數相同的Initialize()函數來解決它。
在找到'FMyEntries'爲空的地方,調用堆棧是什麼? –
好點,是在錯誤的軌道上。我編輯了這個問題。 – thalm