3

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

C++/CLI 库:

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"

或者

const double MyConstDouble = MyCPlusPlusCLILib.CPPCLIClass.Invalid;
// C# compiler error "Must be a compile time const"
4

2 回答 2

8

C++ 中的const关键字声明的常量并非都是 const,它可以用 const_cast<> 任意丢弃。

您需要使用 C++/CLI 特定关键字来声明 .NET 常量,该常量的值存储在元数据中,但也没有底层存储。使用文字关键字:

    literal double Invalid = -1;

这解决了您的问题,C# 编译器对此很满意。请注意公共常量的不确定性。您的 C# 编译器会将值直接编译到生成的 IL 中,用文字值替换“无效”。当您使用更改文字但不重新编译 C# 代码的错误修复来更新 C++/CLI 程序集时,结果会很糟糕。公共常量适用于清单常量,例如 Math::Pi。

于 2013-08-22T14:06:49.423 回答
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;

    ...
}
于 2013-08-22T13:54:58.640 回答