2009-12-18 3 views
3

j'étais sous l'impression que F # les deux lignes suivantes sont censées donner des résultats identiques:F opérateur # chaîne explose sur GUIDs

let a = string v 
let a = v.ToString() 

Il est implicite que v est un objet. Il se avère que si v est un System.Guid la première ligne juste une exception jette:

System.FormatException occurred 
Message="Format String can be only \"D\", \"d\", \"N\", \"n\", \"P\", \"p\", \"B\" or \"b\"." 
Source="mscorlib" 
StackTrace: 
    at System.Guid.ToString(String format, IFormatProvider provider) 
InnerException: 

Je peux certainement faire face à Guids séparément, la question est ce que les autres objets vont me donner le même problème? Dois-je éviter d'utiliser l'opérateur de chaîne du tout? Dans mon cas, l'objet peut potentiellement être quelque chose

Répondre

8

Ceci est un bogue qui sera (sera) corrigé dans la prochaine version.

(En général, cela devrait fonctionner car le problème est dû au fait que System.Guid ne répond pas au spécificateur IFormattable "G", malgré le fait que les docs pour IFormattable disent que tous les implémenteurs doivent implémenter le spécificateur "G". Donc, c'est en fait un bogue dans System.Guid, mais la bibliothèque F # contournera ce bogue dans son prochain opérateur 'string'

En résumé, vous pouvez utiliser cet opérateur en toute sécurité, sauf Guid pour le moment. , mais cela sera corrigé bientôt.) Entre-temps, vous pouvez utiliser Guid-case.

+0

Alors F # va contourner le bug, mais le bug lui-même ne sera pas corrigé? –

+2

Droite. (Si l'équipe qui possède System.Guid a déjà réussi à expédier ce bug apparent 5 fois au cours des 7 dernières années, il semble peu probable qu'ils vont le réparer maintenant.) – Brian

+1

Maintenant * c'est * ce que j'appelle la programmation fonctionnelle du monde réel . ;-) –