将盒装 int64 转换为 int

Cast boxed int64 to int

在通用 class 方法中,我有以下代码:

System::Object^ ObjectValue;
// ...
T Value = (T)ObjectValue;

在运行时的某一时刻,我的 class 被 T 实例化为 int 并且 ObjectValue 包含 System::Int64,但是强制转换操作在上面的代码中给了我一个System::InvalidCastException^。我怎样才能使这个转换工作?

如果没有泛型,您遇到的问题也会发生:

Int64 x64 = 1;
Object^ boxed64 = x64;
int x32 = (int)boxed64;  // InvalidCastException

修复一次转换为拆箱然后再次转换:

int x32 = (int)(Int64)boxed64;  // works

使用 Convert.ChangeType 从未知的盒装类型进行转换:

int x = (int)Convert::ChangeType(obj, int::typeid);

对于仿制药:

generic <typename T>
public ref class Foo
{
public:
    void Bar(Object^ obj)
    {
        T x = (T)Convert::ChangeType(obj, T::typeid);
    }
};