literal (C++/CLI および C++/CX)literal (C++/CLI and C++/CX)

/clr のコンパイルで literal としてマークされた変数 (データ メンバー) は、static const 変数のネイティブの同等物です。A variable (data member) marked as literal in a /clr compilation is the native equivalent of a static const variable.

すべてのプラットフォームAll Platforms

解説Remarks

(この言語機能にはランタイムに適用される特記事項がありません。)(There are no remarks for this language feature that apply to all runtimes.)

Windows ランタイムWindows Runtime

解説Remarks

(この言語機能には Windows ランタイムのみに適用される特記事項がありません。)(There are no remarks for this language feature that apply to only the Windows Runtime.)

要件Requirements

コンパイラ オプション: /ZWCompiler option: /ZW

共通言語ランタイムCommon Language Runtime

解説Remarks

literal とマークされたデータ メンバーは宣言時に初期化される必要があり、値は constant integral、enum、または string 型である必要があります。A data member marked as literal must be initialized when declared and the value must be a constant integral, enum, or string type. 初期化式の型から static const 型のデータ メンバーへの変換では、ユーザー定義の変換は必要ありません。Conversion from the type of the initialization expression to the type of the static const data-member must not require a user-defined conversion.

実行時に literal フィールドにメモリは割り当てられません。コンパイラは、その値をクラスのメタデータに挿入するだけです。No memory is allocated for the literal field at runtime; the compiler only inserts its value in the metadata for the class.

static const とマークされた変数は、他のコンパイラへのメタデータでは利用できません。A variable marked static const will not be available in metadata to other compilers.

詳細については、staticconst を参照してください。For more information, see Static and const.

literal は状況依存キーワードです。literal is a context-sensitive keyword. 詳細については、「状況依存キーワード」を参照してください。See Context-Sensitive Keywords for more information.

Example

次の例は、literal 変数が静的であることを示しています。This example shows that a literal variable implies static.

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

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

Example

次の例は、メタデータでの literal の効果を示しています。The following sample shows the affect of literal in metadata:

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

メタデータでの sclit の違いに注目してください。sc には modopt ディレクティブが 適用され、他のコンパイラでは無視される可能性があることを意味します。Notice the difference in the metadata for sc and lit: the modopt directive is applied to sc, meaning it can be ignored by other compilers.

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

Example

C# で作成された次の例は、前の例で作成されたメタデータを参照し、literal 変数と static const 変数の効果を示しています。The following sample, authored in C#, references the metadata created in the previous sample and shows the affect of literal and static const 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);
   }
}

要件Requirements

コンパイラ オプション: /clrCompiler option: /clr

関連項目See also

.NET および UWP でのコンポーネント拡張Component Extensions for .NET and UWP