Cela ne recréera pas la même sémantique que l'expression Catch When de VB. Il y a une différence essentielle. L'expression VB When est exécutée avant que le déroulement de la pile ne se produise. Si vous deviez examiner la pile au moment d'un filtre when, vous verriez en fait le cadre où l'exception a été levée.
Le fait d'avoir un if dans le bloc catch est différent car le bloc catch s'exécute après le déroulement de la pile. Ceci est particulièrement important lorsqu'il s'agit de signaler des erreurs. Dans le scénario VB, vous avez la possibilité de planter avec une trace de la pile incluant l'échec. Il n'est pas possible d'obtenir ce comportement en C#.
EDIT :
Il a écrit un article de blog détaillé sur le sujet.