ulong
の周りに簡単なラッパーを作成しました。ラッパーをulong
にキャストしてデータを取得できるようにしたい。 uint
にキャストしてデータを失うのは違法であるため、uint
への明示的なキャストは書きませんでした。あなたはC#が私にuint
にキャストすることを許可し、高いビットが失われても例外をスローしなかったときに私の驚きを想像することができます。そのような演算子がない場合、uintへの明示的キャスト
class Program {
static void Main(string[] args) {
ULongWrapper a = new ULongWrapper(0xfffffffffUL);
ulong b = (ulong)a;
uint c = (uint)a;
Console.WriteLine("{0:x}", b);
Console.WriteLine("{0:x}", c);
}
}
class ULongWrapper {
private ulong data;
public ULongWrapper(ulong data) {
this.data = data;
}
public static explicit operator ulong(ULongWrapper x) {
return x.data;
}
}
出力します:
は、ここに私のテストコードです
私はコンパイル時に失敗するuint
にキャストしたいので、これは、不要な行動のように思える
fffffffff
ffffffff
!コンパイラはulong
明示的キャスト演算子を使用していて、境界チェックなしで暗黙的にその結果をuint
にキャストしています。これはC#のバグですか?もしそうでなければ、なぜですか?
'int d =(int)a'はエラーを生成します。CS0030: 'TestProgram.ULongWrapper'を 'int'に変換できません。しかし、 'int d =(int)b'は動作します。 – Zach
クラスからuintへの明示的な変換を定義し、変換メソッドで例外をスローする方法はありますか? – phoog