Как я могу объявить управляемый метод в C ++ / CLI, который имеет необязательный параметр при использовании из C #?
Я украсил этот параметр атрибутом Необязательно и DefaultParameterValue (см .: Как кодируются значения параметров по умолчанию ), но только Необязательно атрибут, кажется, почитается.
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
выход
0
Ожидаемый результат:
2
Visual C # IntelliSense:
MyClass1.MyClass1([int myParam1 = 0]); // wrong default value
↑
Редактировать: При более внимательном рассмотрении дизассемблера выясняется, что компилятор C ++ / CLI действительно не генерирует требуемую директиву .param [1] = int32(2)
. Указанный Reflector код IL неверен.
Отражатель:
.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 )
...