Wie erzwinge ich eine Laufzeitkonstante als Kompilierzeitkonstante?

7

Also arbeite ich an einem auf Chemie basierenden Projekt und bin auf dieses heikle Problem gestoßen. Ich habe eine Reihe von Funktionen, die Chemie-Berechnungen durchführen und die Avogadros-Zahl als Standardparameter für eine Funktion übergeben wollen. Lassen Sie mich den Code einfach sprechen lassen:

%Vor%

Bearbeiten: war nicht exponentiell Format, danke Jungs

    
user2202911 01.02.2014, 17:54
quelle

4 Antworten

14

Sie können im Allgemeinen nicht. Alles, was einen Methodenaufruf beinhaltet, ist nicht , was eine Kompilierzeitkonstante ist, was den Compiler betrifft.

Was Sie tun können, ist ein double literal, das jedoch die wissenschaftliche Notation verwendet:

%Vor%

Also in diesem speziellen Fall können Sie es ohne Lesbarkeitsverlust schreiben.

In anderen Einstellungen, solange der Typ einer der primitiven Typen oder decimal ist, können Sie die Konstante einfach als Literal ausgeben und einen Kommentar verwenden, um zu erklären, wie Sie ihn erhalten haben. Zum Beispiel:

%Vor%

Beachten Sie, dass, obwohl Methodenaufrufe nicht in konstanten Ausdrücken verwendet werden können, andere Operatoren dies können. Zum Beispiel:

%Vor%

Siehe Abschnitt 7.19 der C # 5-Spezifikation für weitere Details darüber, was in einem konstanten Ausdruck erlaubt ist.

    
Jon Skeet 01.02.2014, 17:59
quelle
2

Für eine Konstante zur Kompilierungszeit müssen Sie das Schlüsselwort const verwenden. Aber um es zu verwenden, muss Ihr Ausdruck selbst eine Kompilierzeitkonstante sein, wie Sie bemerkt haben: Sie können keine Funktionen wie Math.Pow verwenden.

%Vor%

Wenn Sie Ihre Konstante nicht zu einer Kompilierzeitkonstante überarbeiten können oder wollen, können Sie sie nicht in Kompilierungskontexten verwenden, aber Sie könnten dies umgehen, indem Sie sie überladen, so dass ein Laufzeitwert als sort of ein Standardargument:

%Vor%

(Der Wert der Konstante ist übrigens entweder falsch oder hat einen sehr irreführenden Namen. Er sollte höchstwahrscheinlich 6.022E+23 sein.)

    
hvd 01.02.2014 18:01
quelle
2

Definieren Sie einfach die Avogadros-Nummer als wissenschaftliche Notation:

%Vor%     
user1937198 01.02.2014 17:58
quelle
1

Sie können dies im exponentiellen Format tun: 6.022E-22

    
zord 01.02.2014 17:59
quelle

Tags und Links