2016-03-10 45 views
2

元組類型我有一個obj這實際上是一個元組DateTime*int*decimal*decimal,它是一個obj,因爲我創造tuple使用,F#鑄OBJ從FSharpValue.MakeTuple

let tupleType = typeof<(DateTime*int*decimal*decimal)> 
let ret = FSharpValue.MakeTuple(x, tupleType) 

現在我想投ret。科莉DateTime*int*decimal*decimal,我做到了,

ret :?> DateTime*int*decimal*decimal 

我的問題是我可以用tupleType做鑄造,而不是指定的類型明確在上面的代碼?

+0

這開始變得非常複雜,不能輕易完成。 –

回答

4

您無法按照您的預期來完成,正如Mark在his answer中所解釋的那樣。但是,使用type abbreviation你可以做的是:

open System 
open Microsoft.FSharp.Reflection 

type MyTuple = DateTime*int*decimal*decimal 

let ret = FSharpValue.MakeTuple([|DateTime.Now;1;1.0M;1.0M|],typeof<MyTuple>) 
let myTuple = ret :?> MyTuple 

越來越MyTuple類型,後者攜帶有編譯時輸入about元組構成要件信息的myTuple

5

簡短的回答是沒有

鑄造和類型檢查在編譯時已經發生。它被稱爲靜態類型,因爲這些類型獨立於運行時(動態)值。代碼未運行時,類型已可用(即靜態)。

在編譯時,ret具有靜態類型obj,而在運行時它具有類型DateTime*int*decimal*decimal

但是,編譯器不知道,除非你告訴它。

同樣,在編譯時和運行時,tupleType的類型都是Type。這是,但是,是DateTime*int*decimal*decimal。該信息僅在運行時可用。

如果您想ret的類型爲DateTime*int*decimal*decimal,您需要告訴編譯器這是類型。在編譯時,tupleType不提供該信息。

如果你可以設計你的系統以便你不需要使用Reflection,那麼你可以保持類型安全,所以如果這是可能的話,它可能是更好的選擇。