Почему я не могу использовать константу внутри оператора switch в пределах области видимости?
С помощью этого кода:
public partial class Form1 : Form
{
private static readonly int TABCONTROL_BASICINFO = 0;
private static readonly int TABCONTROL_CONFIDENTIALINFO = 1;
private static readonly int TABCONTROL_ROLESANDSECURITY = 2;
private static readonly int TABCONTROL_INACTIVEINFO = 3;
. . .
int ActiveTabPage = tabControlWorker.SelectedIndex;
switch (ActiveTabPage) {
case TABCONTROL_BASICINFO:
if (currentNode == "NodeBuckingham") {
} else if (currentNode == "NodeNamath") {
} else if (currentNode == "NodeParsons") {
} else {
}
break;
... Мне нужно заменить "TABCONTROL_BASICINFO" на "0", или я получаю: "Постоянное значение
ожидается "
Небеса Мургатроиду! Не может ли он посмотреть вверх и увидеть, что TABCONTROL_BASICINFO равен 0?
Ответы
Ответ 1
Если вы хотите сделать это постоянным выражением в отношении компилятора, объявите его как const
:
// Note that static readonly is implied here
private const int TABCONTROL_BASICINFO = 0;
Или следуйте соглашениям об именах .NET...
private const int TabControlBasicInfo = 0;
Или используйте перечисление, учитывая, что вы в основном получили фиксированный набор значений:
private enum TabControlType
{
// Could ditch the explicit values here if you want
BasicInfo = 0,
ConfidentialInfo = 1,
...
}
Кстати, вы также можете включить строки в С#, чтобы это:
if (currentNode == "NodeBuckingham") {
} else if (currentNode == "NodeNamath") {
} else if (currentNode == "NodeParsons") {
} else {
}
Может стать:
switch (currentNode) {
case "NodeBuckingham":
...
break;
case "NodeNamath":
...
break;
case "NodeParsons":
...
break;
default:
...
break;
}
Ответ 2
A readonly
переменная не является константой. Значение не известно во время компиляции, но может быть инициализировано либо в объявлении (как вы это сделали), либо в конструкторе класса (в данном случае статическом конструкторе для вашего класса).
Подробнее см.
http://msdn.microsoft.com/en-us/library/acdd6hb7(v=vs.71).aspx
Вы можете изменить его на:
private const int TABCONTROL_BASICINFO = 0;
Если вам не нужно вычислить что-то для инициализации переменной, объявите ее как const
. Это будет немного более эффективно.
Ответ 3
Это не константа; это переменная только для чтения. Если вы хотите, чтобы он был константой, пометьте его как константу.
private const int TabControlBasicInfo = 0;
Или даже лучше:
private enum TabControl
{
BasicInfo,
...
}
...
switch(whatever)
{
case TabControl.BasicInfo:
Ответ 4
Статическая readonly не является постоянной переменной. Он может быть инициализирован. В то время как " const" является постоянным.