2

まず、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());
4

3 に答える 3

7
object foo  = (int) 43;
long   lFoo = ((IConvertible) foo).ToInt64(null);
于 2008-10-07T03:08:19.553 に答える
4

値の型にキャストする場合、実際にはボックス化解除の IL 操作を強制しています。これには、キャスト先の型がボックス化された値と正確に一致する必要があります。同時に発生する可能性のある暗黙的または明示的な変換はありません。

これは通常、型コード (または型を使用する場合は if/else) を使用して切り替えを行う必要があることを意味します。または、あなたの場合は、null のチェックに続いて Convert.ToInt64() を処理する必要があります。正しく。

于 2008-10-07T02:45:38.570 に答える
0

あなただけではありませんが、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
}
于 2008-10-07T02:56:37.330 に答える