Состояние идентичного корпуса

Я конвертирую некоторый код VB.NET в C #, так как он мне удобнее, и это помогает мне быстрее решать проблемы. Однако я наткнулся на этот код, который НЕ является ошибкой в ​​VB.NET, но преобразование его в C # вызывает ошибку компилятора.

Код VB.NET

Select Case name
    Case "FSTF"
    .....
    Case "FSTF"
    .....
End Select

Преобразованный код C #

switch(name) {
    case "FSTF":
        ....;
        break;
    case "FSTF":
        ....;
        break;
}

И ошибка:

В этом операторе переключения уже встречается метка case "FSTF": '.

Какое здесь решение - означает ли это, что в коде VB.NET второй оператор case был фиктивным - или первый случай был фиктивным?


person Sekhar    schedule 11.08.2011    source источник
comment
Что ты имеешь в виду, был просто пустышкой?   -  person jcolebrand    schedule 11.08.2011
comment
если у меня есть следующие утверждения int a; а = 1; а = 2; тогда я бы поверил, что утверждение a = 1 фиктивно - поскольку нет смысла выполнять этот оператор; Я знаю, что без информации об операторах (вызовах функций и т. Д.) Было бы трудно сказать ... поэтому мой вопрос был в том, какой из них выполняется первым, а какой - следующим?   -  person Sekhar    schedule 11.08.2011
comment
Я никогда не слышал этот термин.   -  person jcolebrand    schedule 11.08.2011
comment
Я знаю - моя формулировка была неправильной. Я имел в виду что-то вроде NOP   -  person Sekhar    schedule 11.08.2011
comment
dummy от dumb, что означает unable to speak. dummy затем стал издевкой над человеком (также манекеном или марионеткой). В конце концов все, что было имитацией или замещением чего-либо, превратилось в пустышку. Lorem ipsum часто называют dummy copy или dummy text. А потом, в конце концов, что-нибудь нефункциональное. В кодировании это сводится к NOOP, как сказал @ user331225.   -  person Chris Haas    schedule 11.08.2011
comment
Я думаю, что реальный вопрос здесь: что происходит в VB.NET, когда 2 раздела Case имеют одинаковую метку?   -  person Joe    schedule 11.08.2011


Ответы (2)


Из документации по случаю Select ...:

Если testexpression соответствует предложению expressionlist более чем в одном предложении Case, выполняются только операторы, следующие за первым совпадением.

Так что здесь второй случай фактически избыточен. Лично я предпочитаю подход C # для выделения того, что почти наверняка было незамеченной программной ошибкой, а не преднамеренное введение повторяющегося случая ...

person Jon Skeet    schedule 11.08.2011
comment
спасибо за ссылку на документацию! в любом случае, что я могу заставить vb.net генерировать ошибку компилятора для таких вещей ?? - person Sekhar; 11.08.2011
comment
@ user331225: Не знаю. - person Jon Skeet; 11.08.2011
comment
VB.Net позволяет одному оператору Case принимать диапазон значений (например, от 6 до 10 или ›9), а также позволяет операторам case использовать непостоянные выражения. Хотя может быть полезно иметь предупреждение, когда статический анализ показывает, что конкретный случай никогда не может произойти, легитимность кода не должна зависеть от способности компилятора его анализировать. - person supercat; 12.08.2011
comment
@ user331225 вы можете написать собственный анализатор, использующий API компилятора Roslyn, хотя это потребует значительных усилий. - person Tomasz Maczyński; 25.06.2016

Я предполагаю, что это было сделано таким образом, чтобы сделать VB.NET совместимым с Visual Basic 6.0 и более старые версии, потому что они так себя вели. Если бы VB.NET сообщил об ошибке компиляции, такой как C #, было бы сложнее перенести старый код Visual Basic на VB.NET.

Странно то, что VB.NET не кажется достаточно умен, чтобы исключить избыточный регистр в сгенерированном CIL код. Это приводит к еще одному необычному различию между C # и VB.NET. То есть VB.NET не меняет свою стратегию с последовательного поиска на поиск Dictionary при нацеливании на строковые типы как C #. Это означает, что Select конструкции VB.NET, использующие строковые типы, могут выполняться медленнее, чем switch аналог C #. Причина этого (кредит отдан MarkJ) заключается в том, что операторы case C # могут содержать только константы, тогда как операторы case Visual Basic могут содержать выражения.

person Brian Gideon    schedule 11.08.2011
comment
Операторы C # case должны быть постоянными выражениями, поэтому компилятор C # может генерировать код, который кэширует Dictionary для последующего повторного использования. Операторы VB.Net Case могут быть выражениями, поэтому компилятор VB не может использовать эту стратегию в общем случае. - person MarkJ; 12.08.2011