Warum kann ich nicht haben „public static const string S =“ Stoff ", in meiner Klasse?

StackOverflow https://stackoverflow.com/questions/408192

  •  03-07-2019
  •  | 
  •  

Frage

Beim Versuch, meine Klasse zu kompilieren, erhalte ich eine Fehlermeldung:

  

Die Konstante 'NamespaceName.ClassName.CONST_NAME' kann nicht statisch markiert werden.

auf der Zeile:

public static const string CONST_NAME = "blah";

Das konnte ich in Java die ganze Zeit tun. Was mache ich falsch? Und warum ist es mir dies nicht tun lassen?

War es hilfreich?

Lösung

Ein const Objekt ist immer static.

Andere Tipps

Aus der Sprache C # Spezifikation (PDF Seite 287 - oder die 300. Seite des PDF):

  

Auch wenn Konstanten betrachtet werden   statische Elemente, eine Konstante   Erklärung weder verlangt noch   ermöglicht einen statischen Modifikator.

A const Element statisch vom Compiler betrachtet sowie impliziert konstanten Wert Semantik, die Verweise auf die Konstante bedeutet, könnten in den unter Verwendung von Code als der Wert des konstanten Gliedes kompiliert werden, anstelle einem Hinweis auf das Element.

Mit anderen Worten, ein const Element den Wert 10 enthält, kann in Code kompiliert bekommen, die sie als die Nummer 10 verwendet, anstelle eines Verweises auf das konstante Element.

Dies unterscheidet sich von einem statischen Nur-Lese-Feld, das immer als Referenz auf dem Gebiet erstellt werden.

Beachten Sie, ist diese Pre-JIT. Wenn die JIT'ter ins Spiel kommt, könnte es diese in den Zielcode als Werte kompilieren beide.

C # 's const ist genau die gleiche wie Java final, außer es unbedingt immer static ist. Meiner Meinung nach, ist es nicht wirklich notwendig für ein const variable nicht-static zu sein, aber wenn Sie einen const Variable nicht-static-ly zugreifen müssen, können Sie tun:

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;
    }    
}

Nun, jetzt merke ich, diese Frage vor 4 Jahren gefragt wurde, aber da ich ca. 2 Stunden Arbeit investiert, die aus versuchen, alle Arten von verschiedenen Möglichkeiten zu beantworten und Code-Formatierung, in diese Antwort, ich bin Entsendung es immer noch . :)

Aber für das Protokoll, ich fühle mich immer noch ein bisschen albern.

Von MSDN: http://msdn.microsoft.com/en-us /library/acdd6hb7.aspx

... Auch während ein const Feld ein Kompilierung-Konstante ist, kann das Nur-Lese-Feld für die Laufzeitkonstanten verwendet werden ...

So statisch Verwendung in konst Feldern ist wie der Versuch, eine definiert zu machen (mit #define) statisch in C / C ++ ... Da es mit seinem Wert in Compile-Zeit natürlich ersetzt wird einmal für alle Instanzen ausgelöst ( = statisch).

const ähnlich ist statisch wir beide Variablen mit Klassennamen zugreifen können aber diff statische Variablen geändert werden kann und const kann es nicht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top