literal (C++/CLI)

/clr のコンパイルで literal とマークされた変数 (データ メンバー) は、コンパイル時の定数となります。 これは、C# const 変数にネイティブに相当します。

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

解説

(この言語機能にはランタイムに適用される特記事項がありません。)

Windows ランタイム

解説

(この言語機能には Windows ランタイムのみに適用される特記事項がありません。)

共通言語ランタイム

解説

literal としてマークされたデータ メンバーは、宣言時に初期化する必要があります。 また、値は定数整数、列挙型、または文字列型である必要があります。 初期化式の型から literal データ メンバーの型への変換では、ユーザー定義に変換できません。

実行時に literal フィールドにメモリは割り当てられません。コンパイラは、その値をクラスのメタデータに挿入するだけです。 literal 値は、コンパイル時の定数として扱われます。 標準 C++ で最も近いものは constexpr ですが、C++/CLIで データ メンバーは constexpr にできません。

literal としてマークされている変数は、マークされた static const とは異なります。 static const データ メンバーは、他のコンパイラではメタデータとして利用できません。 詳細については、次のトピックを参照してください。 static および const

literal は状況依存のキーワードです。 詳細については、「状況依存キーワード」を参照してください。

この例は、literal 変数が static を暗示することを示しています。

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

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

メタデータの literal の効果のサンプルを次に示します:

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

メタデータでの sclit の違いに注目してください。sc には modopt ディレクティブが 適用され、他のコンパイラでは無視される可能性があることを意味します。

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

C# で作成された次のサンプルは、前のサンプルで作成されたメタデータを参照し、literalstatic 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);
   }
}

必要条件

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

関連項目

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