Partage via


literal (C++/CLI)

Une variable (membre de données) marquée comme literal dans une /clr compilation est une constante au moment de la compilation. Il s’agit de l’équivalent natif d’une variable C# const .

Toutes les plateformes

Notes

(Aucune remarque pour cette fonctionnalité de langage ne s’applique à tous les runtimes.)

Windows Runtime

Notes

(Aucune note de cette fonctionnalité de langage ne s’applique qu’au Windows Runtime.)

Common Language Runtime

Notes

Un membre de données marqué comme literal doit être initialisé lorsqu’il est déclaré. Et la valeur doit être un type intégral, enum ou chaîne constant. La conversion du type de l’expression d’initialisation vers le type du membre de données ne peut pas nécessiter une conversion définie par l’utilisateur literal .

Aucune mémoire n’est allouée au champ au moment de l’exécution literal ; le compilateur insère uniquement sa valeur dans les métadonnées de la classe. La literal valeur est traitée comme une constante au moment de la compilation. L’équivalent le plus proche en C++ standard est constexpr, mais un membre de données ne peut pas être constexpr en C++/CLI.

Une variable marquée comme différente literal d’une variable marquée static const. Un static const membre de données n’est pas disponible dans les métadonnées pour d’autres compilateurs. Pour plus d’informations, consultez static et const.

literal est un mot clé contextuel. Pour plus d’informations, consultez mots clés sensibles au contexte.

Exemples

Cet exemple montre qu’une literal variable implique static.

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

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

L’exemple suivant montre l’effet des literal métadonnées :

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

Notez la différence entre sc et lit dans les métadonnées : la directive modopt est appliquée à sc, ce qui signifie qu’elle peut être ignorée par d’autres compilateurs.

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

L’exemple suivant, créé en C#, fait référence aux métadonnées créées dans l’exemple précédent et affiche l’effet des variables et static const des literal variables :

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

Spécifications

Option du compilateur : /clr

Voir aussi

Extensions de composants pour .NET et UWP