2017-06-23 52 views
1

我在F#中聲明瞭以下類型,其中包含一個DataTable類型標籤。 創建記錄ÿ當它不編譯,與各種其它類型的場的「類型‘DTTest’沒有定義記錄類型中的DataTable標籤 - 編譯錯誤

type DTTest = { 
    dt:DataTable   
} 

let y:DTTest = { //compile error 
    dt = null 
} 

作品中的錯誤消息:

type DTTest = { 
    dt:DateTime   
} 

let y:DTTest = { //compiles 
    dt = DateTime.MinValue 
} 

DataTable在這裏導致編譯錯誤的原因是什麼?有沒有其他類型不能在記錄類型中使用?

+0

不應該有這樣的限制。兩者都應該沒問題。也許你沒有打開一個名稱空間? –

+0

這與'DataTable'沒有任何關係。沒有不能用於記錄的類型。你在使用任何IDE嗎?你有任何投訴嗎?你會得到任何編譯器警告或其他錯誤?你確定你已經打開了定義「DataTable」的命名空間嗎?你確定你正在引用正確的程序集嗎? –

+0

不是。添加System.Data dll作爲參考之後,我打開了System.Data命名空間。我正在使用VS 2013. – ronilk

回答

3

正如在評論中提到的,這應該很好。

,如果你不打開System.Data命名空間可以得到一個錯誤:

> type DTTest = { dt:DataTable } 
    let y:DTTest = { dt = null } 
    ;; 
stdin(5,20): error FS0039: The type 'DataTable' is not defined 

或者你可以得到另一個錯誤,如果DataTable是你在F#中定義的類型,它不允許null

> type DataTable = (...) 
    type DTTest = { dt:DataTable } 
    let y:DTTest = { dt = null } 
    ;; 
stdin(5,20): error FS0043: The type 'DataTable' does not have 'null' as a proper value 

我認爲唯一的情況是您會收到一條消息,說DTTest未定義是如果您以某種意外的方式使用F#Interactive。例如,如果重新啓動F#Interactive並選擇let y:DTTest = { .. }並且運行該行,則會出現錯誤,因爲F#Interactive不會自動加載所有必要的定義 - 您必須先自己評估這些定義。