F#强制System.String.Format的重载

时间:2013-07-15 09:34:24

标签: f# overloading

我想使用System.String.Format格式化一个字符串,它有5个重载:

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参数被解释为Object,因此调用了第一个重载。所以我正确地得到以下错误:

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

有没有办法强制“正确”过载?

2 个答案:

答案 0 :(得分:9)

@ John的答案的一个更优雅的变体是添加类型注释,以便编译器对数组的所有元素进行自动向上转换:

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

答案 1 :(得分: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);;