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的主要内容,如果未能解决你的问题,请参考以下文章