Я хорошо знаю, что C# не разрешает readonly
полей в switch
блоках, что является то, что this question адресов.В чем причина того, что вы не можете использовать поля readonly в блоках переключателей?
Я хотел бы понять почему это случай. Это просто произвольная спецификация языка, или есть техническая причина этого, и если да, то какова техническая причина?
Позвольте мне пояснить, что я понимаю разницу между const
и readonly
, и я знаю, что C# switch
const
требует значения или значения известны во время компиляции. Для меня, функционально, используя кучу if..else if
утверждений имеет тот же результат, что и использование switch
заявления, потому что все, что я могу сделать с switch
заявлением я могу достичь с if
, а также, например:
const int MyConstantValue = 10;
int myCompareValue = 3;
if(myCompareValue == MyConstantValue)
{
//...
}
else
{
//...
}
switch(myCompareValue)
{
case MyConstantValue:
//...
break;
default:
//...
break;
}
Обе эти конструкции имеют одинаковый результат: выполняется блок else
или default
, но if
может выполнять его без констант времени компиляции или известных значений. Почему if
делать то, что switch
не может?
Переключатели 'C#' моделируются после' C/C++ 'переключателей, которые имеют одинаковое ограничение. Причина в производительности: оператор switch может быть скомпилирован в очень эффективную «таблицу перехода», что было бы невозможно, если случаи не были известны во время компиляции. Таким образом, ответ заключается в том, чтобы «обеспечить, чтобы оператор switch был выполнен». Другим моментом является то, что оператор switch имеет явно уникальные случаи во время компиляции, но без постоянных случаев, которые не были бы доказуемы во время компиляции. –
@MatthewWatson, это то, что я искал, опубликовать ваш комментарий в качестве ответа, и я его приму. – Logan
Ваше недоразумение начинается с * То, что я не понимаю, это функционально, используя кучу if..else, если утверждения имеют одинаковый результат *. Это не! Прочитайте комментарий Matthews. –