如何在C++中使用C++/CLI时声明一个具有可选参数的托管方法?托管C++/CLI方法中的可选参数
我已经用Optional和DefaultParameterValue属性(请参阅:How default parameter values are encoded)修饰参数,但只有可选属性似乎得到遵守。
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#智能感知:
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)
...
是否有一个原因,过载是行不通的,你的目的是什么? – 2011-02-11 21:38:20
@韦斯P:只是美学原因。当我无法实现这个工作时,我会做重载,但如果可能的话,我更喜欢可选参数。 – dtb 2011-02-11 21:45:31