Это не будет воссоздавать ту же семантику, что и выражение VB Catch When. Есть одно ключевое отличие. Выражение VB When выполняется до того, как размотка стека произойдет. Если бы вы исследовали стек в точке когда фильтр, вы бы фактически увидели кадр, в который было сгенерировано исключение.
Наличие if в блоке catch отличается от того, что блок catch выполняется после разматывания стека. Это особенно важно, когда дело доходит до сообщений об ошибках. В сценарии VB у вас есть возможность сбоя с трассировкой стека, включая сбой. Невозможно получить такое поведение в C #.
EDIT:
Написал подробное сообщение в блоге на эту тему.