this SO question中描述的问题存在类似的问题
然而,在我的情况下,可选的param默认值是:
1.在单独的C ++ / CLI dll中定义
2.已在该lib中定义为“public static const”
当我尝试将该值用作C#的默认参数值时,我得到“必须是编译时常量”
有没有办法在(C ++ / cli)库和(C#)app之间共享一个公共const值?
C ++ / CLI lib:
namespace MyCPlusPlusCLILib {
public ref class CPPCLIClass {
public:
static const double Invalid = -1;
}
C#代码:
public MyMethod(double fish = MyCPlusPlusCLILib.CPPCLIClass.Invalid) { }
// C# compiler error "Must be a compile time const"
OR
const double MyConstDouble = MyCPlusPlusCLILib.CPPCLIClass.Invalid;
// C# compiler error "Must be a compile time const"
答案 0 :(得分:8)
C ++中的 const 关键字声明的常量不是const的常量,可以使用const_cast<>任意抛弃。
您需要使用特定于C ++ / CLI的关键字来声明.NET常量,其值存储在元数据中但不具有底层存储。使用 literal 关键字:
literal double Invalid = -1;
这解决了你的问题,C#编译器很满意。请注意公共常数的不确定性。您的C#编译器将直接将值编译到生成的IL中,用文字值替换“Invalid”。当您使用更改文字但不重新编译C#代码的错误修复更新C ++ / CLI程序集时,这将变得很糟糕。公共常量可以用于显式常量,例如Math :: Pi。
答案 1 :(得分:1)
MyCPlusPlusCLILib.CPPCLIClass.Invalid
不是编译时常量,因为您可以放入MyCPlusPlusCLILib
的不同版本,Invalid
设置为不同的值。
如果你不想让C#方法的默认值为显式-1
,你可以这样做:为C#默认选择一个不同的值,当你得到它时,替换为C ++ / CLI Invalid
。
public void MyMethod(double fish = Double.NaN)
{
if (Double.IsNaN(fish))
fish = MyCPlusPlusCLILib.CPPCLIClass.Invalid;
...
}