Корректный match:
def x = match (1)
{
| i when i is int || i is object => 2
| _ => 1
};
def x = match (1)
{
| i is int | i is object => 2
| _ => 1
};
Тут ошибка, видимо разрешено только обобщение типа:
def x = match (1)
{
| i is int | i is double => 2
| _ => 1
};
Убеждаемся что это так:
def x = match (1 : object)
{
| i is ArgumentNullException | i is ArgumentException => 2
| _ => 1
};
Теперь как обстоят дела в catch:
catch
{
| e when e is ArgumentNullException || e is MethodAccessException =>
Console.WriteLine("A");
}
А сократить уже нельзя даже при обобщении типа:
catch
{
| e is ArgumentNullException | e is Exception =>
Console.WriteLine("A");
}
Почему такое несоответсвие, хотя и там и там сопостовление с образцом ?
Здравствуйте, _nn_, Вы писали:
__>Почему такое несоответсвие, хотя и там и там сопостовление с образцом ?
Потому что там от сопоставления с образцом только синтаксис:
MainParser.n
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, _nn_, Вы писали:
__>>Почему такое несоответствие, хотя и там и там сопоставление с образцом ?
C>Потому что там от сопоставления с образцом только синтаксис: MainParser.n
Было бы хорошо если бы синтаксис сохранялся.
Здравствуйте, _nn_, Вы писали:
__>Было бы хорошо если бы синтаксис сохранялся.
Может и было бы хорошо иметь полнофункциональное сопоставление с образцом, но код из блока catch транслируется в обработчики MSIL .catch, с которым задается только один тип исключения, по которому CLR проводит выбор исполняемого catch-блока.
Для реализации сопоставления с образцом надо использовать директивы .filter (в них можно поместить код, который выбирает, какой обработчик исключения исполняется). Но для этого следует прописать кодогенерацию match-а для директив .filter, что, мне кажется, нетривиально.
А толку от этого немного: все равно код catch { | SpecialEx | GeneralEx => blah } эквивалентен catch { | GeneralEx => blah }, а других фич match-а там и не выйдет использовать.
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, _nn_, Вы писали:
__>>Было бы хорошо если бы синтаксис сохранялся.
C>Может и было бы хорошо иметь полнофункциональное сопоставление с образцом, но код из блока catch транслируется в обработчики MSIL .catch, с которым задается только один тип исключения, по которому CLR проводит выбор исполняемого catch-блока.
C>Для реализации сопоставления с образцом надо использовать директивы .filter (в них можно поместить код, который выбирает, какой обработчик исключения исполняется). Но для этого следует прописать кодогенерацию match-а для директив .filter, что, мне кажется, нетривиально.
C>А толку от этого немного: все равно код catch { | SpecialEx | GeneralEx => blah } эквивалентен catch { | GeneralEx => blah }, а других фич match-а там и не выйдет использовать.
Ну разве что when можно как в
VB
Здравствуйте, _nn_, Вы писали:
__>Ну разве что when можно как в VB
when можно
Здравствуйте, _nn_, Вы писали:
__>Почему такое несоответсвие, хотя и там и там сопостовление с образцом ?
Это практический вопрос или теоретический? Ну, не разу в жизни не нужно было полиморфной обработки исключений. Их вообще лучше по меньше обрабатывать
![](/Forum/Images/smile.gif)
.
Если нужен круто паттерн-матчинг, то не грех в обработчике еще match добавить.
В общем, я бы забил на подобное усовершенствование. Разве что на 2.0 отложить.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, _nn_, Вы писали:
__>>Почему такое несоответсвие, хотя и там и там сопостовление с образцом ?
VD>Это практический вопрос или теоретический? Ну, не разу в жизни не нужно было полиморфной обработки исключений. Их вообще лучше по меньше обрабатывать
.
В данном случае теоретический.
Подумалось, раз синтаксис похож, то может можно использовать сопоставление и решил проверить.
VD>Если нужен круто паттерн-матчинг, то не грех в обработчике еще match добавить.
+1
VD>В общем, я бы забил на подобное усовершенствование. Разве что на 2.0 отложить.
+1