0

我正在编写一个 C#(托管)应用程序应该使用的 C++/CLI 库。

我想编写一个接受可选参数的方法,在 C# 中可以写成:

void Function (object obj, object opt1 = null, int opt2 = 0)

当用 C# 编写这样的东西时,在 Intellisense 中确实显示了同样的东西。

在 C++/CLI 中,我在头文件中写入:

void Function (Object^ obj, [Optional] Object^ opt1 , [Optional] int opt2);

编译我的库后,我在 C# Intellisense 中获得以下函数:

void Function (object object, object opt1 = bad value, int opt2 = bad value)

备注:我知道默认值不能更改为“ default(TYPE)”以外的任何值,所以我什至不尝试。

4

1 回答 1

1

C# 团队非常不愿意将可选参数添加为语言特性。他们屈服于第 4 版的大众需求,尤其是 Office 编程如果没有它就相当残酷。

该功能的问题不止一个,在这种情况下重要的是该功能与语言密切相关。可选参数和默认参数在 C++ 中的工作方式非常不同。可选参数...在方法签名中编码(想想 printf),默认参数值是语言中的纯编译器功能,默认值通常从 .h 文件中的函数声明中检索。当您尝试在 C3222 的 ref 类方法上使用它时失败了,实现者知道它在 2005 年无法使用,并且该语言从那时起一直处于维护模式。

缺少的是默认参数值,C++/CLI 编译器不会生成默认参数值,因此元数据反编译器只能显示“错误值”。不像它不能工作,你可以Type::Missing在你的特定情况下使用 C++/CLI 代码。尽管描述性可能看起来很奇怪,但它nullptr不像您可能从 default(T) 中假设的那样。但与 Office 互操作兼容。

最好在互操作代码中避免这种情况。考虑方法重载。

于 2016-08-11T09:57:07.390 回答