Подтвердить что ты не робот

Почему компилятор С# требует выражения break в конструкции коммутатора?

Мне сложно понять, почему компилятор требует использовать оператор break. Это невозможно пропустить, так как теперь разрешено падение. Я вижу причину разрыва на C или С++, но здесь он нужен.

Почему это не встроенное поведение для разрыва после завершения дела? Разве это не синтаксис без семантики?

Извините, если это глупый вопрос.

EDIT: провал разрешен только в том случае, если случай пуст. Когда есть инструкция, вы не можете опустить оператор break. Итак, это другое дело.

4b9b3361

Ответ 1

Компилятор не столько "нуждается" в операторах break, он требует их.

Это было конструктивное решение, сопоставимое с требованием использования ref при вызове метода с параметром pass-by-reference.

Это сохраняет код семантически близко к C и С++, устраняя подводные камни завала через это всегда было спорным "функция" на языке Си.

Ответ 2

Оператор break в С# был дизайнерским решением создателей языка... По сути, они хотели "однозначный" оператор break, оператор break, который работал бы только одним способом. Короче говоря, они не хотели проваливаться, и если бы они просто предотвратили провал, не включив "перерыв", это сломало бы обратную совместимость с С++.

Ответ 3

Пауза разрешена, если выражение case пустое:

case Foo:  // fallthrough allowed.
case Bar:
    Console.WriteLine ("Foo or Bar");
    break; // required

То, что это недопустимо, является распространенным заблуждением в той же лиге, что "вы не можете назначать значения в if-условиях" *


* Вы можете. Правило в том, что в if-условиях допускаются только логические значения, а x=false с bool x; - логическое значение.

Ответ 4

Обычно этот тип кода является ошибкой:

// Contrived calculator demostration
decimal x = 5m;
decimal y = 10m;
decimal result = 0m;
string blah = "Divide";

// .. other code omitted

switch(blah) {
    case "Divide":
        result = x / y;

    case "Multiply":
        result = x * y;

    case "Add":
        result = x + y;

    case "Subtract":
        result = x - y;

    default:
        MessageBox.Show("Not a valid operation");

}

Однако компилятор не может предположить, что недостающие перерывы являются ошибкой. Насколько ему известно, вы действительно хотели, чтобы дела проваливались.

Просто предполагая, что перерывы должны быть в конце каждого случая, будет просто обмениваться одной ошибкой для другой ошибки.

Итак, разработчики языка отказались от пропусков из непустых случаев и выбросили ошибку, если вы их опустите.

Если вам нужен код, разделяемый между непустыми случаями, поместите его в метод private (возможно, static) и вызовите его оттуда.

Одна последняя заметка: Пустые случаи, проваливающиеся, - это все, что должен делать пустой случай, поэтому это разрешено.