【问题标题】:How to define a compile time constant in an assembly?如何在程序集中定义编译时间常数?
【发布时间】:2016-01-12 14:43:23
【问题描述】:

首先:我正在使用 C++-CLI,但我也想知道 C# 的解决方案。

使用以下代码

组装“基础”

public ref class CONSTS abstract sealed
{
public:
  static const int  SUCCESS     = 1;
  static const int  InProgress  = 101;
};

汇编“程序”

enum class EnumReplyLLI
{
  Nothing = 0,
  SUCCESS = CONSTS::SUCCESS,      // C2057
  Busy    = CONSTS::InProgress,   // C2057
  ...
};

我收到错误C2057:预期的常量表达式

如何定义编译时常量并在另一个程序集中使用它?
我的代码几乎与this SO post 中接受的答案相同,但这不起作用。

【问题讨论】:

    标签: c# c++-cli compile-time-constant


    【解决方案1】:

    C++/CLI 中的 C# const 的真正等价物是 literal,因此您的 CONSTS 类应该如下所示:

    public ref class CONSTS abstract sealed
    {
    public:
        literal int  SUCCESS = 1;
        literal int  InProgress = 101;
    };
    

    【讨论】:

    • 无法编译。错误 C4693。见bytes.com/topic/net/answers/603702-abstract-sealed-literal。正如@BenVoigt 在这篇文章中所说,这将是一个编译器错误......我正在使用 VS 2008 SP1。
    • @TobiasKnauss 刚试过,它用 VS2013 编译没有警告,反正 C4693 是警告,而不是错误。此外,发出警告是以前版本的编译器中的一个错误。如果它不能编译,你可以试试coderforlife.com/… 吗?
    • VS 2008 向我显示错误,所以很遗憾我无法编译。在这里更改编译器不是一个选项,所以我的问题似乎没有解决方案。
    • 你能起飞abstract sealed吗?我知道这会使类成为非静态的,但如果你没有任何“真正的”实例成员,那就没关系了。
    • 我删除了sealed,这就足够了。不完美,但工作。反正我不会实例化它。非常感谢!
    【解决方案2】:

    不知道为什么它不能在 C++ 中工作,但这是 C# 中的等效代码:

    public static class CONSTS 
    {
      public const int  SUCCESS     = 1;
      public const int  InProgress  = 101;
    };
    
    enum EnumReplyLLI
    {
      Nothing = 0,
      SUCCESS = CONSTS.SUCCESS,     
      Busy    = CONSTS.InProgress,  
    };
    

    【讨论】:

    • 你验证了吗?如果是,您应该删除 c2057 cmets。另外,在 c# 中,类 CONSTS 不应该是静态的吗?
    • 是的,我已经验证过了。它可以是静态的,但必须是静态的。
    • 好的。这让我更加想知道为什么它在 c++.net 中失败了......我同意。但是,要使其等价,它必须是静态的。 ;-)
    • @TobiasKnauss 很公平 - 改变了它。
    猜你喜欢
    • 2019-08-06
    • 2023-03-04
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2011-08-12
    • 1970-01-01
    相关资源
    最近更新 更多