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

时间:2013-08-22 13:27:20

标签: c# c++-cli const default-value

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"

2 个答案:

答案 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;

    ...
}