¿Cómo puedo declarar un método administrado en C++/CLI que tiene un parámetro opcional cuando se usa desde C#?Parámetros opcionales en métodos administrados de C++/CLI
He decorado el parámetro con un atributo Optional y DefaultParameterValue (ver: How default parameter values are encoded), pero parece que solo se cumple el atributo Opcional.
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
de salida:
0
Resultados esperados:
2
Visual C# IntelliSense:
MyClass1.MyClass1([int myParam1 = 0]); // wrong default value
↑
Editar: Un vistazo más de cerca con un desensamblador revela que el compilador de C++/CLI no lo hace de hecho generar la directiva .param [1] = int32(2)
requerida. El código IL mostrado por Reflector es incorrecto.
reflector:
.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)
...
¿Hay una razón por la cual una sobrecarga no funcionaría, para sus propósitos? –
@Wes P: razones estéticas. Haré sobrecargas cuando no puedo hacer que esto funcione, pero prefiero los parámetros opcionales si es posible. – dtb