Compartilhar via


literal (C++/CLI)

Uma variável (membro de dados) marcada como literal em uma compilação /clr é uma constante de tempo de compilação. Ela é o equivalente nativo de uma variável C# const.

Todas as plataformas

Comentários

(Não há comentários para esse recurso de linguagem que se apliquem a todos os runtimes.)

Windows Runtime

Comentários

(Não há comentários para esse recurso de linguagem que se apliquem somente ao Windows Runtime.)

Common Language Runtime

Comentários

Um membro de dados marcado como literal deve ser inicializado ao ser declarado. E o valor deve ser do tipo constante, integral, enumeração ou cadeia de caracteres. A conversão do tipo da expressão de inicialização para o tipo do membro de dados literal não deve exigir uma conversão definida pelo usuário.

Nenhuma memória é alocada para o campo literal no runtime. O compilador só insere o próprio valor nos metadados da classe. O valor literal é tratado como uma constante de tempo de compilação. O equivalente mais próximo no C++ Padrão é constexpr, mas um membro de dados não pode ser constexpr no C++/CLI.

Uma variável marcada como literal é diferente de uma marcada como static const. Um membro de dados static const não é disponibilizado em metadados para outros compiladores. Para obter mais informações, consulte static e const.

literal é uma palavra-chave contextual. Saiba mais em Palavras-chave contextuais.

Exemplos

Este exemplo mostra que uma variável literal implica static.

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

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

O exemplo a seguir mostra o efeito de literal nos metadados:

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

Observe a diferença nos metadados para sc e lit: a diretiva modopt é aplicada a sc, o que significa que pode ser ignorada por outros compiladores.

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

O exemplo a seguir, criado em C#, faz referência aos metadados criados na amostra anterior e mostra o efeito das variáveis literal e 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);
   }
}

Requisitos

Opção do compilador: /clr

Confira também

Extensões de componentes para .NET e UWP