Parâmetros opcionais nos métodos gerenciados de C ++ / CLI
Como posso declarar um método gerenciado em C ++ / CLI que possui um parâmetro opcional quando usado em C #?
Decorei o parâmetro com umOpcional e umDefaultParameterValue atributo (consulte:Como os valores padrão dos parâmetros são codificados), mas apenas o atributo Opcional parece ser respeitado.
C ++ / CLI:
public ref class MyClass1
{
public:
MyClass1([System::Runtime::InteropServices::Optional]
[System::Runtime::InteropServices::DefaultParameterValue(2)]
int myParam1) ↑
{
System::Console::WriteLine(myParam1);
}
};
C #:
var myInstance1 = new MyClass1(); // compiles and runs
Resultado:
0
Saída esperada:
2
Visual C # IntelliSense:
MyClass1.MyClass1([int myParam1 = 0]); // wrong default value
↑
Editar: Um exame mais detalhado com um desmontador revela que o compilador C ++ / CLI de fato não gera os requisitos.param [1] = int32(2)
directiva. O código IL mostrado pelo Reflector está errado.
Refletor:
.method public hidebysig specialname rtspecialname instance void .ctor([opt] int32 myParam1) cil managed
{
.param [1] = int32(2) // bug
...
ILDASM:
.method public hidebysig specialname rtspecialname instance void .ctor([opt] int32 myParam1) cil managed
{
.param [1]
.custom instance void [System]System.Runtime.InteropServices.DefaultParameterValueAttribute::.ctor(object) = ( 01 00 08 02 00 00 00 00 00 )
...