Double.TryParseは例外をスローしない?
http://bugzilla.ximian.com/show_bug.cgi?id=72221でMonoが16進数のパースが出来ないという不具合報告がありました。
using System; using System.Globalization; class X { public static void Main () { string str = "0dead"; double d; // Console.WriteLine(Double.Parse (str, NumberStyles.HexNumber)); Console.WriteLine(Double.TryParse (str, NumberStyles.HexNumber, null, out d)); } }
上記サンプルを実行すると、
MS.NET : True Mono : False
となります。
しかし、TryParseのドキュメントを見ると変換元となる文字列は、
MSDNから引用
s パラメータには、 PositiveInfinitySymbol 、 NegativeInfinitySymbol 、 NaNSymbol 、または次の書式の文字列を格納できます。
[ws][sign]integral-digits[.[fractional-digits]][e[sign]exponential-digits][ws]
省略可能な項目は、角かっこ ([および]) で囲まれています。"digits" という語を含む項目は、0 から 9 までの一連の数字から構成されます。
と書いてあり、16進文字列はサポートしていない様に思えます。なので、TryParseをParseに変えて実行するとMonoでは例外が発生します。
System.ArgumentException: An invalid argument was specified.
では、これはプログラムとドキュメントのどちらのバグなんでしょうか? で、試しに.NET2.0 Betaで実行してみたところ、
System.ArgumentException: The number style AllowHexSpecifier is not supported on floating pont data types.
と、例外がスローされ、16進数はサポートしないとハッキリと言われます。Monoの実装の方が正しそうです。これで解決かと思いきや、.NET2.0はParseだけでなく、TryParseでも例外をスローしてくれます。あれ? TryParseは例外をスローしないんじゃ・・・
MSDNから引用
TryParse メソッドは、変換が失敗した場合でも例外をスローしない点を除いては、 Parse メソッドと同じです。
ひょっとして、NumberStyles.HexNumberという間違ったパラメータを指定することは変換失敗ではなく、TryParseの呼び出し方が間違っているという解釈になりますか? これは見落とすよなぁ・・・(^^;
(追記) という話をMonoのメーリングリスト等でやりたいのですが、英語力がないので一言、
.NET1.x bug?
と書いて終わってしまいます。(^^;