Warum kann ich nicht haben „public static const string S =“ Stoff ", in meiner Klasse?
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?
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.