2008年07月29日

拡張メソッドと単項演算子の優先順位

   このエントリーをはてなブックマークに追加 Clip to Evernote
static class DecimalExtentions {
public static decimal Floor(this decimal num) {
return decimal.Floor(num);
}
}

という拡張メソッドをC#で書く。
これで、

Decimal.Floor(124.4m)

ではなく、

124.4m.Floor();

って書けるようになる。

でテストコードを書いてみたら、

Assert.AreEqual(-125m, -124.5m.Floor());

が、失敗してしまう。

Console.WriteLine(-124.5m.Floor());

の結果は、

-124だ。

あれ、変だな??? -125になってないぞ。

試しに

Assert.AreEqual(-125m, Math.Floor(-124.5m));

て書いたらOKだ。

一瞬、decimal.Floorのバグ?って思ったけど、ステップ実行してみたわかった。

    public static decimal Floor(this decimal num) {
return decimal.Floor(num);
}

の引数には、-124.5m じゃなく、124.5mが渡って来てる。
そうか、結合の優先順位が、メソッド呼び出しの方が高いんだ。
メソッド呼び出しの後から、単項演算子のマイナスが評価されるから、

 -decimal.Floor(124.5m)

になっちゃうんだ。


 

この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/gushwell/51584052