2013-07-15 90 views
3
的過載

我想格式化使用System.String.Format它具有5個重載的字符串:F#迫使System.String.Format

String String.Format(String format , Object arg0) 
String String.Format(String format , Object arg0 , Object arg1) 
String String.Format(String format , Object arg0 , Object arg1 , Object arg2) 
String String.Format(String format , params Object[] args) 
String String.Format(IFormatProvider provider , String format , params Object[] args) 

我想用第四過載(在一個取的陣列對象)像這樣:

let frm = "{0} - {1}" 
let args = [| 1; 2 |] 
System.String.Format(frm, args) 

問題是args參數被解釋爲一個對象,因此第一個重載被調用。所以正確我得到以下錯誤:

System.FormatException: Index (zero based) must be greater than or equal to zero and less than the size of the argument list. 

有沒有辦法強制「正確」超載?

+0

yes ..所以我應該把所有的元素都轉換成對象? – MSX

+1

任何不做地道的原因:'sprintf「%d - %d」1 2「 - 它正是爲了避免這個問題?任何你想創建一個冗餘數組而不是通過'String.Format(「{0} - {1}」,方框1,方框2)調用第二個重載的原因?或者爲什麼不'sprintf「%A」[| 1; 2 |]'? (我相信你有一個理由,但沒有傷害,要清楚爲什麼這些途徑是不適當的,以使最好的答案) –

回答

9

A的更優雅的變種@ John的答案是添加類型註釋,以便編譯器將對數組的所有元素執行自動上傳:

let frm = "{0} - {1}" 
let args : obj [] = [| 1; 2 |] 
System.String.Format(frm, args) 
+0

昨晚我只好這樣做了! – mydogisbox

2

您可以在陣列中的每個元素轉換爲一個對象,像這樣迫使正確的過載:

let frm = "{0} - {1}" 
let args = [| 1:> obj; 2 :>obj|] 
System.String.Format(frm, args);; 

,或者如果你有一個較長的列表

let frm = "{0} - {1}" 
let args = [| 1; 2 |] |> Array.map (fun t ->t:> obj) 
System.String.Format(frm, args);; 
+0

太棒了!非常感謝。 – MSX

+4

@JohnPalmer,你也可以做'Array.map框',它應該做同樣的事情。 – MisterMetaphor