整数の cast が切り捨てでなく四捨五入になる場合がある。
次は全部1になる。
# python じゃないよ。Booだよ。
for v in (1.3, 1.4, 1.5, 1.6):
print v cast int
次は何故か1.5と1.6が2になる。
# python じゃないよ。Booだよ。
for v as object in (1.3, 1.4, 1.5, 1.6):
print v cast int
object が duck になっても同じ。
コンパイラソースを追って見る
- Boo のILコード出力は EmitAssembly クラス(コンパイラパイプラインの1ステップ=ICompilerStep)
- cast 演算子のコード出力は OnCastExpression() メソッド(EmitAssemblyは構文木visitor)。
- OnCastExpression() → LoadExpressionWithType() → EmitCastIfNeeded() と呼び出し。
- EmitCastIfNeeded() は変換元/変換先の型から必要なコード出力。ここでobject/duck(value型でない場合)からint等の型へ変換する場合、ランタイムの変換メソッドを呼ぶコードになる。
- その変換メソッドが四捨五入らしい。
結論
object や duck の primitive 型への変換はILダイレクトではないから遅い(あたりまえ)。