在C#中使用时,如何在C++/CLI中声明具有可选参数的托管方法?
我使用Optional和DefaultParameterValue属性修饰了参数(请参阅:如何编码默认参数值),但只有Optional属性才被尊重.
C++/CLI:
public ref class MyClass1
{
public:
MyClass1([System::Runtime::InteropServices::Optional]
[System::Runtime::InteropServices::DefaultParameterValue(2)]
int myParam1) ?
{
System::Console::WriteLine(myParam1);
}
};
Run Code Online (Sandbox Code Playgroud)
C#:
var myInstance1 = new MyClass1(); // compiles and runs
Run Code Online (Sandbox Code Playgroud)
输出:
0
Run Code Online (Sandbox Code Playgroud)
预期产出:
2
Run Code Online (Sandbox Code Playgroud)
Visual C#IntelliSense:
MyClass1.MyClass1([int myParam1 = 0]); // wrong default value
?
Run Code Online (Sandbox Code Playgroud)
编辑:仔细观察反汇编程序会发现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
...
Run Code Online (Sandbox Code Playgroud)
ILDASM:
.method …Run Code Online (Sandbox Code Playgroud)