今回はちょっとVB.NETの不満点の一つを。まあここでC#のコードを移植する以外直接書くことはないから大した問題ではないんですけど。
21日の記事だったと思いますが、そのときVB.NETにC#のコードを移植していて気付いたんですが、VB.NETはキャストする際Cなんとか関数(以下、型変換関数)を使用するんですよね(ところでこれはコンパイル時に解決されるから関数と言うよりはマクロかステートメントとでも呼ぶべきかも知れません)。IntegerにキャストするならCInt、2005から追加された符号無し系でもUIntegerにキャストするのにCUInt。
ま、それは構いません。(byte)4とやろうがCByte(4)とやろうが結果が同じなら。
問題は、結果が違いうると言うことです。具体的に言えば、型変換関数にはオーバーフローチェックが入っちゃうんですよね。しかもそれを無視して(型落ちを容認して)強制的にキャストする手段がなかなかない。
状況を限定すればまあ計算で求まるんですからそれでいいかもしれませんけど、ロジックを考える手間も(手間と言うほどではありませんが)考えれば、もうちょっと汎用的な手段がないものか。Convert.To関係のもオーバーフローチェックしちゃうんですよねぇ。オーバーフローチェックしないオーバーロードがあっても良いと思うんだけどなぁ。この部分はエンディアンには影響されないというか関係ないだろうし。
取りあえず思いついた手段をまあ9/21の記事で使ったんですが、論理和で必要桁だけマスクしてから、一旦ToString("X")を使って16進数の文字列にし、それをConvert.ToHogehoge(String, Integer)で必要な型に変換するというもの。途中で16進(または2進)を挟めば何故かオーバーフローチェックしなくなるんですよね。これで&H80008355なんてのがShortにもIntegerにもマイナス値に変換できるようになります。
がしかし、まあなんというか美しくない。なにかもっと良い手段はないもんですかね。どなたかVBに詳しい方いらっしゃいません?