相关疑难解决方法(0)

托管C++/CLI方法中的可选参数

在C#中使用时,如何在C++/CLI中声明具有可选参数的托管方法?

我使用OptionalDefaultParameterValue属性修饰了参数(请参阅:如何编码默认参数值),但只有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)

.net c# c++-cli optional-parameters

28
推荐指数
3
解决办法
1万
查看次数

标签 统计

.net ×1

c# ×1

c++-cli ×1

optional-parameters ×1