1

次の最小限のコードがあります。

using namespace System;

long get_prop( Object^ v )
{
    return Convert::ToInt32( v );
}

int main()
{
    Object^ o1 = gcnew Int32( -1 );
    Object^ o2 = gcnew UInt32( 0xFFFFFFFF );
    long value1 = get_prop( o1 );
    long value2 = get_prop( o2 );

    return 0;
}

それは機能のOverflowException例外を与えget_propます。最後にget_prop、純粋な C++ コードでの結果を使用する必要があります。get_propどちらの場合でも例外なく機能するように関数を記述する正しい方法は何ですか。C++ のようなある種のテンプレートを使用できますか、それとももっと簡単な解決策がありますか?

4

1 に答える 1

1

うーん、あなたは 32 ビットの豚を 31 ビットのポークに詰め込もうとしています。このコードは、次のように Convert::ToInt32(UInt32 value) を呼び出すことになります。

public static int ToInt32(uint value)
{
    if (value > 0x7fffffff)
    {
        throw new OverflowException(Environment.GetResourceString("Overflow_Int32"));
    }
    return (int) value;
}

カブーム。どのような種類のオーバーフロー動作が必要かはわかりませんが、これにより、コンパイラは無視して例外を回避できます。

long get_prop( Object^ v )
{
    return (long)Convert::ToInt64( v );
}
于 2010-11-09T17:30:26.473 に答える