literal
(C++/CLI)
在 /clr
编译中标记为 literal
的变量(数据成员)是编译时常量。 它是 C# const
变量的原生等效项。
所有平台
备注
(此语言功能没有适用于所有运行时的备注。)
Windows 运行时
备注
(此语言功能没有只适用于 Windows 运行时的备注。)
公共语言运行时
注解
标记为 literal
的数据成员必须在声明时进行初始化。 并且,该值必须是常量整数、枚举或字符串类型。 从初始化表达式类型到 literal
数据成员类型的转换不需要用户定义的转换。
在运行时没有为 literal
字段分配内存;编译器只将其值插入该类的元数据中。 literal
值被视为编译时常量。 标准 C++ 中最接近的等效项是 constexpr
,但 C++/CLI 中的数据成员不能是 constexpr
。
标记为 literal
的变量与标记为 static const
的变量不同。 static const
数据成员在其他编译器的元数据中不可用。 有关详细信息,请参阅 static
和 const
。
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;
};
注意 sc
和 lit
在元数据上的区别:modopt
指令应用于 sc
,表示其他编译器会将其忽略。
.field public static int32 modopt([mscorlib]System.Runtime.CompilerServices.IsConst) sc = int32(0x00000001)
.field public static literal int32 lit = int32(0x00000000)
以下示例使用 C# 编写,引用了在前一个示例中创建的元数据,并显示了 literal
和 static 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