まず、2 つの例:
// This works
int foo = 43;
long lFoo = foo;
// This doesn't
object foo = (int)43;
long? nullFoo = foo as long?; // returns null
long lFoo = (long)foo; // throws InvalidCastException
if (foo.GetType() == typeof(int))
Console.WriteLine("But foo is an int..."); // This gets written out
さて、2番目が機能しない理由についての私の推測は、ボクシングが原因です。このコードの背後にある目的は、実装することIComparable
です。エラーをスローするよりも、必要に応じてオブジェクトを long または ulong に強制する方法が必要です。基本的な数値型 (byte、int、long、ubyte など) ごとにチェックを実装する必要はありません。最大の数値型でそれらをキャッチし、そのように処理するだけです。ここにいるすべての賢い人々からの考えは?できればリフレクションを避けて、オブジェクトのボックス化を解除するにはどうすればよいIComparable
ですか?
編集:
これは機能しているように見えますが、問題を回避するための恐ろしいハックのようです。私だけでしょうか?
long lFoo = long.Parse(foo.ToString());