可选参数"必须是编译时常量"

Ric*_*bob 3 c# c++-cli const default-value

我有一个类似的问题,在这个SO问题中描述的问题 在我的情况下,可选的param默认值是:
1.在单独的C++/CLI dll中定义.
2.已在该lib中定义为"public static const"
当我尝试将该值用作C#的默认参数值时,我得到"必须是编译时常量".
有没有办法在(C++/cli)库和(C#)应用程序之间共享一个公共const值?

C++/CLI lib:

namespace MyCPlusPlusCLILib {
    public ref class CPPCLIClass {
    public:
       static const double Invalid = -1;
}
Run Code Online (Sandbox Code Playgroud)

C#代码:

public MyMethod(double fish = MyCPlusPlusCLILib.CPPCLIClass.Invalid) { }
// C# compiler error "Must be a compile time const"
Run Code Online (Sandbox Code Playgroud)

要么

const double MyConstDouble = MyCPlusPlusCLILib.CPPCLIClass.Invalid;
// C# compiler error "Must be a compile time const"
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 8

C++中的const关键字声明的常量不是const的常量,可以使用const_cast <>任意抛弃.

您需要使用特定于C++/CLI的关键字来声明.NET常量,其值存储在元数据中但不具有底层存储.使用literal关键字:

    literal double Invalid = -1;
Run Code Online (Sandbox Code Playgroud)

这解决了你的问题,C#编译器很满意.请注意公共常数的不确定性.您的C#编译器将直接将值编译到生成的IL中,用文字值替换"Invalid".当您使用更改文字但不重新编译C#代码的错误修复更新C++/CLI程序集时,这将变得很糟糕.公共常量可以用于显式常量,例如Math :: Pi.