Как я могу объявить управляемый метод в С++/CLI, который имеет необязательный параметр при использовании с С#?
Я украсил параметр как Optional и DefaultParameterValue (см. Как кодируются значения параметров по умолчанию), но только атрибут Optional, по-видимому, соблюдается.
С++/CLI:
public ref class MyClass1
{
public:
MyClass1([System::Runtime::InteropServices::Optional]
[System::Runtime::InteropServices::DefaultParameterValue(2)]
int myParam1) ↑
{
System::Console::WriteLine(myParam1);
}
};
С#:
var myInstance1 = new MyClass1(); // compiles and runs
Вывод:
0
Ожидаемый результат:
2
Visual С# IntelliSense:
MyClass1.MyClass1([int myParam1 = 0]); // wrong default value
↑
Изменить: Более пристальный взгляд с дизассемблером показывает, что компилятор С++/CLI действительно не создает требуемую директиву .param [1] = int32(2)
. Код IL, показанный 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 )
...