C++ OptionalAttribue 和 C# Intellisense

Posted

技术标签:

【中文标题】C++ OptionalAttribue 和 C# Intellisense【英文标题】:C++ OptionalAttribue and C# Intellisense 【发布时间】:2016-08-11 09:02:36 【问题描述】:

我正在编写一个应该由 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)”以外的任何值,所以我什至不尝试。

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于C++ OptionalAttribue 和 C# Intellisense的主要内容,如果未能解决你的问题,请参考以下文章

结合 C++ 和 C#

c语言和c++和c#的区别

C++ 和 C# 速度测试 - 奇怪的结果

C++ java 和 C# 的区别

如何设计应从 C++ 和 C# 访问的组件

创建可以从 c# 和 c++ 中使用的 c# dll