gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:14:30 31 4
gpt4 key购买 nike

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

我已经用 Optional 修饰了参数和一个 DefaultParameterValue属性(参见:How default parameter values are encoded),但似乎只有 Optional 属性受到尊重。


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 )
...

最佳答案

C# 编译器不使用 [DefaultParameterValue] 属性来设置默认值,它使用 .param 指令获取元数据中嵌入的值。顺便说一句,CLI 规范中几乎没有记录,只有第 II 部分第 15.4.1 章提到它可以有一个 FieldInit 值,15.4.1.4 对此保持沉默。

这就是问题所在,C++/CLI 编译器不知道如何生成指令。你无法完成这项工作。

关于c# - 托管 C++/CLI 方法中的可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4974237/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com