literal (C++/CLI)

Eine Variable (Datenmemmemm), die als literal/clr Kompilierung gekennzeichnet ist, ist eine Kompilierungszeitkonstante. Es ist das systemeigene Äquivalent einer C# const -Variablen.

Alle Plattformen

Hinweise

(Es gibt keine Hinweise für diese Sprachfunktion, die für alle Laufzeiten gültig sind.)

Windows-Runtime

Hinweise

(Es gibt keine Hinweise für diese Sprachfunktion, die nur für Windows-Runtime gelten.)

Übersicht: Common Language Runtime (CLR)

Hinweise

Ein Datenmememm, das als literal "initialisiert" gekennzeichnet ist, muss bei der Deklaration initialisiert werden. Und der Wert muss ein konstanter Integral-, Enumerations- oder Zeichenfolgentyp sein. Die Konvertierung vom Typ des Initialisierungsausdrucks in den Typ des literal Datenmemers kann keine benutzerdefinierte Konvertierung erfordern.

Es wird kein Arbeitsspeicher für das literal Feld zur Laufzeit zugewiesen. Der Compiler fügt seinen Wert nur in die Metadaten für die Klasse ein. Der literal Wert wird als Kompilierungszeitkonstante behandelt. Die nächstgelegene Entsprechung in Standard C++ ist constexpr, aber ein Datenmemmemm kann sich nicht in C++/CLI befinden constexpr .

Eine Variable, die markiert ist, literal unterscheidet sich von einer markierten static const. Ein static const Datenmememm wird in Metadaten für andere Compiler nicht zur Verfügung gestellt. Weitere Informationen finden Sie unter static und const.

literal ist ein kontextbezogenes Schlüsselwort. Weitere Informationen finden Sie unter kontextabhängige Schlüsselwort (keyword)s.

Beispiele

Dieses Beispiel zeigt, dass eine literal Variable impliziert static.

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

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

Das folgende Beispiel zeigt die Auswirkung in literal Metadaten:

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

Beachten Sie den Unterschied in den Metadaten für sc und lit: die modopt-Anweisung gilt für sc, d.h. sie kann von anderen Compilern ignoriert werden.

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

Im folgenden Beispiel, das in C# erstellt wurde, wird auf die metadaten verwiesen, die im vorherigen Beispiel erstellt wurden, und es werden die Auswirkungen und literalstatic const Variablen gezeigt:

// 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);
   }
}

Anforderungen

Compileroption: /clr

Siehe auch

Komponentenerweiterungen für .NET und UWP