Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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