2014-09-17 2 views
0

Я создаю простой компилятор в C++/CLI для создания простого кода иль ... но, когда я пытаюсь построить компилятор, компилятор возвращает этот ERRO:Неправильный тип преобразования в отражении испускают

1>------ Build started: Project: dnccpp, Configuration: Debug Win32 ------ 
1> CodeGen.cpp 
1>CodeGen.cpp(159): error C2664: 'void System::Reflection::Emit::ILGenerator::Emit(System::Reflection::Emit::OpCode,System::Reflection::Emit::LocalBuilder ^)' : cannot convert argument 2 from 'System::Int32 ^' to 'unsigned char' 
1>   No user-defined-conversion operator available, or 
1>   There is no context in which this conversion is possible 
1>CodeGen.cpp(161): error C2664: 'void System::Reflection::Emit::ILGenerator::Emit(System::Reflection::Emit::OpCode,System::Reflection::Emit::LocalBuilder ^)' : cannot convert argument 2 from 'System::Double ^' to 'unsigned char' 
1>   No user-defined-conversion operator available, or 
1>   There is no context in which this conversion is possible 
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ========== 

Я не могу использовать «неподписанный символ» в аргументе, компилятор генерирует неправильный код для этого ...

void CodeGenerator::GenExpr(Expr^ expr, Type^ expectedType, ILGenerator^ il, array<Type^>^ argTypes) 
{ 
    Type^ deliveredType; 

    if (dynamic_cast<Literal^>(expr) != nullptr) 
    { 
     Object^ val = ((Literal^)expr)->value; 
     deliveredType = val->GetType(); 
     if (dynamic_cast<String^>(val) != nullptr) 
      il->Emit(OpCodes::Ldstr, (String^)val); 
     else if (dynamic_cast<Int32^>(val) != nullptr) 
      il->Emit(OpCodes::Ldc_I4, (int^)val); 
     else if (dynamic_cast<Double^>(val) != nullptr) 
      il->Emit(OpCodes::Ldc_R8, (double^)val); 
    } 
} 

ответ

2

ни один из рамочного кодекса (Reflection ИЗЛУЧАЮТ включено) использует строго типизированный боксировал значения.

Избавиться от ^ от Int32^, Double^, double^ и int^.

+0

спасибо! – Alexandre

Смежные вопросы