может быть любое утверждение здесь.

у заявление, и оно компилируется, но компилятор [VS] никогда не говорит мне, что я ставлю точку с запятой два раза.

Это значит в ASP.NET MVC 3

return Json(mydata);;

return Json(mydata);

Они оба компилируются, но первое неверно в шаблоне проектирования. Почему это не говорит мне о двух точках с запятой.

Если нет причины использовать две точки с запятой, почему это не показывает ошибку?

Если это особенное использование, пожалуйста, покажите мне, где две точки с запятой требуются, чтобы написать заявление в C #.

Ответы на вопрос(7)

двойную точку с запятой. Насколько я знаю, Visual Studio жалуется только на точки с запятой, которые могут привести к нежелательному поведению, например, следующий фрагмент:

if (true)
    ;

Поскольку точка с запятой является пустой инструкцией, все выражение if становится бесполезным. Visual Studio жалуется на все такие конструкции (используя, for, foreach и т. Д.) Без скобок вокруг них.

Таким образом, следующий код подходит для VS:

 if (true)
 {
      ;
 }

; разделитель операторов.пустое заявление, которые ничего не делают.

Используя пустое утверждение:

while (Method())
   ;

Или же

void F() {
   //...
   if (done) goto exit;
   //...
   exit: ;
}

Как видите, это поведение правильное. Но в вашем примере у вас будет недоступный код с пустым оператором.

;; разрешено, по историческим причинам. Это похмелье от языков стиля C (на которых основан C #).

В C & C ++ есть концепция макропроцессорных макросов, которые заменяются в коде до его компиляции, например. тривиальный примерAddAndSquare это макрос, а не функция

#define AddAndSquare(X,Y) (X+Y)*(X+Y)
int Foo() {
   int a = 1, b = 2;
   return AddAndSquare(a, b);
}

идет к компилятору как

int Foo() {
   int a = 1, b = 2;
   return (A+B)*(A+B);
}

Вы можете переопределить макросы, чтобы они отличались от их первоначального определения, а также вы можете переопределить их, чтобы они вообще не существовали.

Учитывая макрос утверждения#define ASSERT(c) if(!c) throw new AssertionFailedException() Вы можете засорять свой код заявлениями ASSERT.

void Foo(int x) {
    int y = x + 2;
    ASSERT(y != 0);
   int z = x / y;
    . . . .
}

Теперь учтите, что вы хотите, чтобы утверждения были только в отладочных сборках, но не в сборках выпуска, для выпуска вы переопределяете макрос как пустой (буквально#define ASSERT). Теперь, когда Foo идет к компилятору для сборки релиза, это выглядит так

void Foo(int x) {
    int y = x + 2;
    ;
   int z = x / y;
    . . . .
}

Теперь есть пустой оператор, где был ASSERT, потому что там может быть или не быть оператор (в зависимости от конфигурации сборки), компилятор должен иметь возможность обрабатывать пустой оператор.

Почему это соглашение было сохранено в C #, где нет ничего подобногоC Макросы, я понятия не имею, но, возможно, потому что это причиняет мало или нет вреда.

Я думаю, что несколько; выдается компилятором до того, как он начнет анализ кода, поэтому ваш недостижимый; игнорируется компилятором.

C # компилятор не позволяет;; междуif and else без скобок и компилятор выдаст ошибку в приведенном ниже случае.

if (condition == true)
                ; ; 
            else
                ;

Ошибка компилятора:

Error   CS1513  } expected  and one warning "Possible mistaken empty statement"

Так что если вы удалите одинsemicolon это будет работать отлично (или вам нужно добавить скобки).

 Nathan Cooper14 июн. 2017 г., 15:22
if(int.Parse("1") == 1) { ; } ; else { } ---- Это то, что ваш код. Проблема несколько скучнее, у вас естьelse без ассоциированногоif,; может быть любое утверждение здесь.

спространенное идиоматическое использование в заявлении for, например:

for (; ; )
{
}

если это специальное использование, то покажите мне, где две точки с запятой необходимы, чтобы написать заявление в c #

В приведенном выше примере, конечно, необходимо использовать две точки с запятой.

 Samuel Rondeau-Millaire24 июл. 2017 г., 17:36
Почему бы не использовать цикл while (true) вместо этого?

х использовать». Почему язык должен тратить время и силы, мешающие вам делать это, когда это безвредно?

Решение Вопроса

двойная точка с запятой никогда не требуется. Я немного удивлен, что компилятор не жалуется, что это недостижимое утверждение, но, по-видимому, оно законно. Это не принесет никакого вреда, но в равной степени это не очень хорошая идея.

 Dyppl25 янв. 2011 г., 08:10
Почему бы это, это совершенно достижимо, просто пусто
 Dyppl25 янв. 2011 г., 08:19
ой, извини, я не обратил достаточного внимания на реальный пример, мой плохой.
 Bradley Smith25 янв. 2011 г., 08:20
В зависимости от вашего уровня предупреждения, он может помечать использование двойной точки с запятой как «возможное ошибочное пустое утверждение».
 Jon Skeet25 янв. 2011 г., 08:40
@Bradley: мне не удалось заставить реализацию компилятора Microsoft C # 4 вообще предупредить об этом :(
 Jon Skeet25 янв. 2011 г., 08:13
@Stook: Как это достижимо после безусловного оператора возврата? Попробуйте поместить туда любое другое утверждение (например, объявление переменной), и компилятор выдаст предупреждение.

Ваш ответ на вопрос