literal (C++/CLI)

/clr 编译中标记为 literal 的变量(数据成员)是编译时常量。 它是 C# const 变量的原生等效项。

所有平台

备注

(此语言功能没有适用于所有运行时的备注。)

Windows 运行时

备注

(此语言功能没有只适用于 Windows 运行时的备注。)

公共语言运行时

注解

标记为 literal 的数据成员必须在声明时进行初始化。 并且,该值必须是常量整数、枚举或字符串类型。 从初始化表达式类型到 literal 数据成员类型的转换不需要用户定义的转换。

在运行时没有为 literal 字段分配内存;编译器只将其值插入该类的元数据中。 literal 值被视为编译时常量。 标准 C++ 中最接近的等效项是 constexpr,但 C++/CLI 中的数据成员不能是 constexpr

标记为 literal 的变量与标记为 static const 的变量不同。 static const 数据成员在其他编译器的元数据中不可用。 有关详细信息,请参阅 staticconst

literal 是上下文相关的关键字。 有关详细信息,请参阅上下文相关关键字

示例

此示例显示 literal 变量隐含 static

// mcppv2_literal.cpp
// compile with: /clr
ref struct X {
   literal int i = 4;
};

int main() {
   int value = X::i;
}

以下示例显示了元数据中 literal 的效果:

// mcppv2_literal2.cpp
// compile with: /clr /LD
public ref struct A {
   literal int lit = 0;
   static const int sc = 1;
};

注意 sclit 在元数据上的区别:modopt 指令应用于 sc,表示其他编译器会将其忽略。

.field public static int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) sc = int32(0x00000001)
.field public static literal int32 lit = int32(0x00000000)

以下示例使用 C# 编写,引用了在前一个示例中创建的元数据,并显示了 literalstatic const 变量的效果:

// mcppv2_literal3.cs
// compile with: /reference:mcppv2_literal2.dll
// A C# program
class B {
   public static void Main() {
      // OK
      System.Console.WriteLine(A.lit);
      System.Console.WriteLine(A.sc);

      // C# does not enforce C++ const
      A.sc = 9;
      System.Console.WriteLine(A.sc);

      // C# enforces const for a literal
      A.lit = 9;   // CS0131

      // you can assign a C++ literal variable to a C# const variable
      const int i = A.lit;
      System.Console.WriteLine(i);

      // but you cannot assign a C++ static const variable
      // to a C# const variable
      const int j = A.sc;   // CS0133
      System.Console.WriteLine(j);
   }
}

要求

编译器选项:/clr

另请参阅

.NET 和 UWP 的组件扩展