Поделиться через


literal (C++/CLI)

Переменная (член данных), помеченная как 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

См. также

Расширения компонентов для .NET и UWP