Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Переменная (член данных), помеченная как literal в /clr компиляции, является константой во время компиляции. Это собственный эквивалент переменной C# const .
Все платформы
Замечания
(Отсутствуют комментарии для этой возможности языка, которая применяется во всех средах выполнения.)
Среда выполнения Windows
Замечания
(Отсутствуют комментарии для этой возможности языка, которая применяется только в среде выполнения Windows).
Среда CLR
Замечания
Элемент данных, помеченный как literal должен быть инициализирован при объявлении. И значение должно быть константным целочисленным, перечислением или строковым типом. Преобразование из типа выражения инициализации в тип literal члена данных не может требовать пользовательского преобразования.
Память не выделяется для literal поля во время выполнения. Компилятор только вставляет его значение в метаданные класса. Значение literal рассматривается как константой времени компиляции. Ближайшим эквивалентом в C++ constexprявляется стандартный, но член данных не может находиться constexpr в C++/CLI.
Переменная, помеченная как 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