3

System.String.Format5 つのオーバーロードを持つ文字列をフォーマットしたいと思います。

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 )

次のように、4 番目のオーバーロード (オブジェクトの配列を受け取るオーバーロード) を使用したいと思います。

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.

「正しい」オーバーロードを強制する方法はありますか?

4

2 に答える 2

9

@John の回答のより洗練された変形は、型注釈を追加して、コンパイラが配列のすべての要素に対して自動アップキャストを実行するようにすることです。

let frm = "{0} - {1}"
let args : obj [] = [| 1; 2 |]
System.String.Format(frm, args)
于 2013-07-15T10:56:35.047 に答える
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);;
于 2013-07-15T09:41:44.100 に答える