La constante ne peut pas être marquée statique

J’essaie de déclarer une constante PI comme ceci:

public static const double PI = Math.PI; 

mais pourquoi est-ce que je reçois cette erreur?

 The constant 'Calendar.NewCalendar.PI' cannot be marked static 

const implique static (vous n’avez pas besoin d’une instance pour référencer la valeur const ).

Je veux également append ce point important: lorsque vous créez un lien avec (référence) un assembly avec un public const , cette valeur est copiée dans votre assembly. Donc, si la valeur const dans l’assembly référencé change, votre assembly aura toujours la valeur compilée à l’origine.

Si ce comportement n’est pas acceptable, vous devriez envisager de faire du champ un champ public static readonly .

Lib.dll, fourni en binary:

 public class Foo { public const int HATS = 42; public static readonly int GLOVES = 33; } 

App.exe, fait référence à Lib.dll:

 Foo.HATS // This will always be 42 even if the value in Lib.dll changes, // unless App.exe is recomstackd. Foo.GLOVES // This will always be the same as Foo.GLOVES in Lib.dll 

De MSDN :

Ne créez pas de constante pour représenter les informations que vous prévoyez de modifier à tout moment. Par exemple, n’utilisez pas un champ constant pour stocker le prix d’un service, le numéro de version d’un produit ou le nom de marque d’une entreprise. Ces valeurs peuvent changer au fil du temps et, comme les compilateurs propagent des constantes , d’autres codes compilés avec vos bibliothèques devront être recompilés pour voir les modifications.

De DotNetPerls :

DLL Lorsque vous utilisez un champ ou une déclaration const , le compilateur C # incorpore en fait la valeur de la variable const directement dans le code IL. Par conséquent, il efface essentiellement le const tant qu’entité distincte.

Attention: Si les programmes qui dépendent d’un const ne sont pas recompilés après la modification de la valeur const , ils peuvent se casser [ car ils continueront d’utiliser la valeur précédente ].

Une constante est statique par définition.

Vous ne pouvez pas avoir de const statique Essayez readonly au lieu de const ou déposez simplement le “static” car “const” est de toute façon statique.

Les constantes ne peuvent pas être remplacées dans le code pendant la compilation, pas l’exécution, il n’y a donc pas besoin de définitions statiques vs d’instance.

Toutes les déclarations de constantes sont implicitement statiques, et la spécification C # indique que l’inclusion (redondante) du modificateur statique est interdite. Je pense que cela permet d’éviter la confusion qui pourrait se produire si un lecteur voyait deux constantes, l’une déclarée statique et l’autre non – elles pourraient facilement supposer que la différence de spécification impliquait une différence de sémantique. Cela dit, il n’ya pas d’interdiction de spécifier de manière redondante un modificateur d’access qui est également le modificateur par défaut, où il y a un choix. Par exemple, une méthode (concrète) peut être explicitement marquée comme étant privée, bien que ce soit la valeur par défaut. La règle semble être que lorsqu’il n’y a pas de choix (par exemple, une déclaration de méthode dans une interface), le modificateur redondant est interdit. Là où il y a un choix, c’est permis.