Je ne pense pas que le fait qu'il manque dans la table des types valides cause le problème (le modificateur "% c" est définitivement supporté, parce que le type de printfn "%c"
est char -> unit
comme on peut s'y attendre). Donc, ça ressemble à un bug pour moi.
Une solution simple est d'utiliser le modificateur "% O" qui prend tout type (comprenant également char
valeurs) et les formats à l'aide de la méthode ToString
(avaliable pour tous les types de NET):
> printfn "%10O" 'a';;
a
val it : unit
BTW: Je regardé le code source de la bibliothèque F # (à partir de la version CTP) et voici le bit correspondant de printf.fs
(ligne 478):
| 's',nobj::args ->
formatString outputChar info width (unbox nobj) false; i+1,args
| 'c',nobj::args ->
outputChar (unbox nobj); i+1,args // (1)
| 'b',nobj::args ->
formatString outputChar info width
(if (unbox nobj) then "true" else "false") false; i+1,args
| 'O',xobj::args ->
formatString outputChar info width
(match xobj with null -> "<null>" | _ -> xobj.ToString()) false; i+1,args
La ligne (1) formate un caractère et ignore le paramètre width
(qui correspond à la largeur que vous avez spécifiée). Donc, à moins que cela ne soit (pour une raison quelconque, par exemple la performance?) Un comportement voulu, cela semble vraiment être un bug!
Je suppose que l'implémentation suivante permettrait de résoudre le problème (Brian ;-)! Êtes-vous là?):
| 'c', nobj::args ->
formatString outputChar info width
(string ((unbox nobj):char)) false; i+1,args