web-dev-qa-db-ja.com

クラスに「public static const string S = "stuff";」を含めることができないのはなぜですか?

クラスをコンパイルしようとすると、エラーが発生します。

定数'NamespaceName.ClassName.CONST_NAME'を静的とマークすることはできません。

行で:

public static const string CONST_NAME = "blah";

私は常にJavaでこれを行うことができました。私は何が間違っていますか?そして、なぜそれが私にこれをさせないのですか?

281
jjnguy

constオブジェクトは常にstaticです。

522
Joel Coehoorn

C#言語仕様(PDF 287ページ-またはPDFの300ページ)から:

定数は静的メンバーと見なされますが、定数宣言は静的修飾子を必要とせず、許可もしません。

89
splattne

Constメンバーは、定数値のセマンティクスを含むコンパイラーによって静的と見なされます。つまり、定数への参照は、メンバーへの参照ではなく、定数メンバーの値として使用コードにコンパイルされる可能性があります。

つまり、値10を含むconstメンバーは、constメンバーへの参照ではなく、値10として使用するコードにコンパイルされる場合があります。

これは、フィールドへの参照として常にコンパイルされる静的な読み取り専用フィールドとは異なります。

注、これはpre-JITです。 JIT'terが登場すると、これらの両方を値としてターゲットコードにコンパイルします。

C#のconstは、絶対に常にfinalであることを除いて、Javaのstaticとまったく同じです。私の意見では、const変数が非staticである必要は本当にありませんが、const変数に非static- lyにアクセスする必要がある場合は、次のようにできます。

class MyClass
{    
    private const int myLowercase_Private_Const_Int = 0;
    public const int MyUppercase_Public_Const_Int = 0;

    /*        
      You can have the `private const int` lowercase 
      and the `public int` Uppercase:
    */
    public int MyLowercase_Private_Const_Int
    {
        get
        {
            return MyClass.myLowercase_Private_Const_Int;
        }
    }  

    /*
      Or you can have the `public const int` uppercase 
      and the `public int` slighly altered
      (i.e. an underscore preceding the name):
    */
    public int _MyUppercase_Public_Const_Int
    {
        get
        {
            return MyClass.MyUppercase_Public_Const_Int;
        }
    } 

    /*
      Or you can have the `public const int` uppercase 
      and get the `public int` with a 'Get' method:
    */
    public int Get_MyUppercase_Public_Const_Int()
    {
        return MyClass.MyUppercase_Public_Const_Int;
    }    
}

さて、私はこの質問が4年前に尋ねられたことに気付きましたが、さまざまな答え方とコードのフォーマットのあらゆる種類を試すことからなる約2時間の仕事をこの答えに入れたので、私はまだそれを投稿しています。 :)

しかし、記録のために、私はまだちょっとばかげていると感じています。

5
Meowmaritus

MSDNから: http://msdn.Microsoft.com/en-us/library/acdd6hb7.aspx

...また、constフィールドはコンパイル時定数ですが、読み取り専用フィールドはランタイム定数に使用できます...

したがって、constフィールドでstaticを使用することは、C/C++で(#defineを使用して)定義済みを静的にしようとするようなものです。 。

5
uriel

constはstaticに似ていますが、クラス名で両方の変数にアクセスできますが、diffはstatic変数を変更でき、constは変更できません。

2
soujanya