質問
まず、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());
解決
object foo = (int) 43;
long lFoo = ((IConvertible) foo).ToInt64(null);
他のヒント
値の型にキャストするときは、実際にボックス解除IL操作を強制します。これには、キャストする型がボックス化された値と完全に一致する必要があります。同時に発生する可能性のある暗黙的または明示的な変換はありません。
これは通常、タイプコード(またはタイプを使用している場合はif / else)を使用して切り替えを行う必要があることを意味します。または、場合によってはnull正しく対処してください。
それはあなただけではありませんが、tryparseは例外を発生させません。
object foo = (int)43;
long outVal;
if(long.TryParse(foo.ToString(),out outVal))
{
//take action with correct value of long
}
else
{
//maybe passed you another type of object
}
所属していません StackOverflow